2010-05-08 60 views

回答

5

我從臀部射擊這裏,但這裏是一個開始:

DECLARE @STARTDATE DATETIME 
DECLARE @ENDDATE DATETIME 

SET @STARTDATE = '05/01/2010' 
SET @ENDDATE = GETDATE() 

-- Find the seconds between these two dates 
SELECT DATEADD(SECOND, Number, @StartDate) AS N 
FROM Numbers 
WHERE Number < DATEDIFF(SECOND, @STARTDATE, @ENDDATE) 

這是假定表被叫號碼,與從1包含值命名列數。能夠獲得整個月的結果,你將需要有大約250萬的價值。我可能會把查詢時間縮短到一天,這意味着Numbers表的數值可能小於100,000。

這裏有一個數字表一大篇:需要http://www.sqlservercentral.com/articles/Advanced+Querying/2547/

註冊,但它是免費的。如果你做任何嚴肅的SQL Server編程,這個站點是非常有用的。

+0

我認爲'Number <= DATEDIFF(SECOND,@StartDate,@EndDate)'會更好,因爲它可以使用索引,並且您在使用where子句中的別名時會有問題。 (+1雖然打我讓代碼) – 2010-05-08 22:02:01

1

您可能需要一個輔助數字表。你是否需要全部的秒數,或者你是否可以輪到最接近的秒數,然後按組進行分組?

我們在此討論的還有多少秒鐘,以及您目前將它們存儲在什麼格式中。它們是否已經四捨五入?

如果沒有,那麼也許要避免將它們四捨五入或每次做一個BETWEEN類型查詢(以及重複的DATEADDs)的開銷,也許您可​​以在插入/更新時使用Marc的DATEDIFF答案來存儲某些基礎的秒數日期,然後使用計算出的數字列加入到數字表中。

代碼從這裏創建數字表http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-numbers-table.html只需添加到布拉德的答案。

CREATE TABLE dbo.Numbers 
( 
    Number INT IDENTITY(1,1) PRIMARY KEY CLUSTERED 
) 

WHILE COALESCE(SCOPE_IDENTITY(), 0) <= 1000000 
BEGIN 
    INSERT dbo.Numbers DEFAULT VALUES 
END 
+0

您可能想詳細說明。我可能不是唯一一個不知道你在說什麼的人。 – Gabe 2010-05-08 21:29:33

+0

打敗我吧。這肯定聽起來像是一個數字表的完美使用。 – BradBrening 2010-05-08 21:29:54

0
DATEDIFF (s , @FirstDate , @SecondDate) 
相關問題