SQL Server 时间格式为 23:59:59 而不是 00:00:00

Pie*_*ard 0 sql t-sql sql-server

我有以下代码。我想要时间格式为 '23:59:59' 而不是 '00:00:00' 的第二个(截止)日期。请问如何实现这一点?

declare @Date datetime 
declare @StartDate datetime 
declare @EndDate DateTime

set @date = GetDate()
Set @StartDate = DATEADD(M, DATEDIFF(M,0,@date),0)
set @EndDate = DATEADD(DD,DATEDIFF(DD,0, @date),0)

select @StartDate,@EndDate
Run Code Online (Sandbox Code Playgroud)

Joe*_*orn 12

DateTime 类型内部根本不使用文本。相反,它是一种二进制类型,您看到的任何其他指示都是该工具的便利。对于这种事情的最佳策略是尽可能长时间地将值保留为二进制类型,并且仅在最后一刻向用户显示的格式。

在结束日期的情况下,您在范围的最后一天获得一个值,并且您希望它包含全天,您最好的选择是调整第二天的开始,然后使用独占 范围末端的小于比较 (<),而不是包含在内的小于或等于(<=) 或 BETWEEN。这种方法称为半开放

所以你会这样做:

WHERE myColumn >= @StartDate and myColumn < DATEADD(day, 1, @EndDate)
Run Code Online (Sandbox Code Playgroud)

而不是这个:

WHERE myColumn BETWEEN @StartDate AND @EndDate
Run Code Online (Sandbox Code Playgroud)

或者,在本例中,设置@EndDate如下:

declare @Date datetime 
declare @StartDate datetime
declare @EndDate Datetime

set @date = current_timestamp
Set @StartDate = DATEADD(month, DATEDIFF(month,0,@date),0)
set @EndDate = DATEADD(day, 1, CAST(@date as date))
Run Code Online (Sandbox Code Playgroud)

然后,再次在范围末尾使用独占边界:

WHERE myColumn >= @StartDate and myColumn < @EndDate
Run Code Online (Sandbox Code Playgroud)

如果您确实需要获取一天中的最后一刻(同样:它通常效率较低不太精确),您仍然可以从在目标日期的开始添加一天开始。然后,您可以从中减去您需要的任何数量(秒、毫秒、3.33 毫秒刻度等)。