SELECT DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0);
原理:以基準日 0 (1900-01-01) 計算日差,再加回去,時間歸零。
-- 版本 1 SELECT CAST(CAST(CAST(GETDATE() AS DATE) AS CHAR(10)) + ' 00:00:00.000' AS DATETIME); -- 版本 2 (更簡潔) SELECT CAST(CAST(GETDATE() AS DATE) AS DATETIME);
SQL 2008 引入 DATE 型別,直接截斷時間部分。
CREATE FUNCTION dbo.MidnightOf(@dt DATETIME)
RETURNS DATETIME
AS BEGIN
RETURN DATEADD(year, DATEPART(year, @dt)-2000,
DATEADD(month, DATEPART(month, @dt)-1,
DATEADD(day, DATEPART(day, @dt)-1, '2000')));
END
| 寫法 | CPU (ms/10萬次) | 適用版本 |
|---|---|---|
| DATEADD/DATEDIFF | ~15 | 2000+ |
| CAST DATE | ~22 | 2008+ |
| 自訂函數 | ~45 | 2000+ |
建議生產環境直接使用 方法一,無版本限制且效能最好。