在撰寫「當日結束時間」作為查詢範圍上界時,需精確到 SQL Server `DATETIME` 型別的最小解析度 3.33 毫秒,即 23:59:59.997。以下提供標準、可重複使用的計算方式。
DECLARE @Now DATETIME = CURRENT_TIMESTAMP; -- 目前日期時間
DECLARE @Midnight DATETIME = CAST(CAST(@Now AS DATE) AS DATETIME); -- 今天 00:00:00
-- 取得今天最大時間值
SELECT DATEADD(MILLISECOND, -3, DATEADD(DAY, 1, @Midnight));
-- 結果範例:2011-09-09 23:59:59.997
CREATE FUNCTION dbo.fn_EndOfDay (@dt DATETIME)
RETURNS DATETIME
AS BEGIN
DECLARE @Midnight DATETIME = CAST(CAST(@dt AS DATE) AS DATETIME);
RETURN DATEADD(MS, -3, DATEADD(DAY, 1, @Midnight));
END;
GO
-- 使用範例
SELECT dbo.fn_EndOfDay(GETDATE()); -- 今天結束
SELECT dbo.fn_EndOfDay('2023-12-25'); -- 指定日期結束
DECLARE @StartDate DATE = '2023-01-01';
DECLARE @EndDate DATE = '2023-01-31';
SELECT * FROM Orders
WHERE OrderTime >= @StartDate -- 含 00:00:00.000
AND OrderTime <= dbo.fn_EndOfDay(@EndDate); -- 含 23:59:59.997
DATETIME2 精度 100 奈秒,最大值 23:59:59.9999999,可用 DATEADD(NANOSECOND, -100, ...)。DATE 型別僅存日期,若欄位為 `DATE` 型別,直接 `<= @EndDate` 即可,無需計算時間部分。