问题描述
我的表中有以下日期时间列“UpdatedTime”
样本值:2021-12-31 00:00:00.000
我需要操纵小时、分钟和秒来变成 23:59:59
(即午夜前一秒。)
预期值:2021-12-21 23:59:59.000
提前致谢
解决方法
我会使用 dateadd()
,但我会将其表述为:
select dateadd(second,24 * 60 * 60 - 1,UpdatedTime)
或者只是添加一个时间值:
select UpdatedTime + '23:59:59'
,
您可以按如下方式使用 DATEADD() 函数(为清楚起见,请检查 SQL Fiddle):
SELECT
*,DATEADD(hour,23,DATEADD(minute,59,DATEADD(second,date_))) as updated_datetime
FROM dates_;
输出:
date_ updated_datetime
----------------------- -----------------------
2021-01-01 00:00:00.000 2021-01-01 23:59:59.000
,
假设您使用的是足够现代的 MSSQL 版本,这应该可以:
DECLARE @dt DATETIME = '2021-12-31 00:00:00.000'
SELECT DATETIMEFROMPARTS(
DATEPART(YEAR,@dt),DATEPART(MONTH,DATEPART(DAY,/* hour */
59,/* minute */
59,/* second */
0 /* fractional seconds*/
);
如果我没有通过计算您请求的日期时间来提及这一点,我也会失职,您可能正在使用反模式。如果您计算上述内容的目标是执行以下操作:
select *
from dbo.yourTable
where DateCreated >= @StartOfDay
and DateCreated <= @EndOfDay;
如果 DateCreated 列接受类似“2021-12-21 23:59:59.997”的值,您最终会遇到上述问题。
如果这确实是您的目标,最好将该查询编写为:
select *
from dbo.yourTable
where DateCreated >= @StartOfDay
and DateCreated < @StartOfNextfDay;
即使用半开区间而不是全闭区间。