ISO長(112)會做的伎倆:
SELECT CONVERT(INT, CONVERT(VARCHAR(8), GETDATE(), 112))
鑄造GETDATE()直,ISO 112,以詮釋給41008出於某種原因,但通過VARCHAR去似乎工作 - 我會更新如果我想到更快的演員陣容。
編輯:在僅VS VARCHAR辯論關於整型,這裏是我的調查結果(可重複我的試驗檯&生產服務器)的Varchar方法使用較少的CPU時間爲五十萬石膏,但整體的一小部分慢 - 可以忽略不計除非你有幾十億行
EDIT 2的處理:修訂測試用例清除緩存和不同的充日期
DBCC FREEPROCCACHE;
DBCC DROPCLEANBUFFERS;
SET STATISTICS TIME ON;
WITH RawDates ([Date])
AS (SELECT TOP 500000
DATEADD(DAY, N, GETDATE())
FROM TALLY
)
SELECT YEAR([Date]) * 10000 + MONTH([Date]) * 100 + DAY([Date])
FROM RawDates
SET STATISTICS TIME OFF
(500000 row(s) affected)
SQL Server Execution Times:
CPU time = 218 ms, elapsed time = 255ms.
DBCC FREEPROCCACHE;
DBCC DROPCLEANBUFFERS;
SET STATISTICS TIME ON;
WITH RawDates ([Date])
AS (SELECT TOP 500000
DATEADD(DAY, N, GETDATE())
FROM TALLY
)
SELECT CONVERT(INT, CONVERT(VARCHAR(8), [Date], 112))
FROM RawDates
SET STATISTICS TIME OFF
(500000 row(s) affected)
SQL Server Execution Times:
CPU time = 266 ms, elapsed time = 602ms
轉換GETDATE()直與IS 112到INT給出41008,因爲這是自日期0以來的天數。您可以通過將該結果與0和GETDATE()之間的DATEDIFF結果進行比較來進行驗證。 'SELECT CONVERT(INT,GETDATE(),112),DATEDIFF(day,0,GETDATE())' – 2012-04-10 16:02:53
@AdamPorad +1歡呼聲,以澄清 – HeavenCore 2012-04-10 16:05:38
我認爲你的測試存在缺陷。經過時間的差異是將長列表值顯示在屏幕上的結果。此外,您正在使用GetDate(),因此SQL Server將其識別爲常量,並不實際執行每行的計算。您需要使用實際表格中的一列。最後,要準確地測試性能,您需要刪除乾淨的緩衝區並釋放過程緩存。您不應該在生產服務器上執行此操作。 – 2012-04-10 17:44:29