获取日期 SQL 服务器的最大可能时间

Get the max possible time of a date SQL Server

我想做的是在 SQL 服务器中获取一个日期,并找到该日期的最后可能的小时、分钟、秒和毫秒。

所以如果日期是这样的:2021-02-16 13:08:58.620

我想return:2021-02-16 23:59:59.999

我试过类似的方法,但它不起作用,我想我遗漏了一些东西,它正在转换时间并保持该日期的小时、分钟、秒和毫秒

Select 
    DateAdd(MILLISECOND, -1, (Convert(datetime, DATEADD(day, 1, DateValue), 101))) as lastPossibleDate
From 
    Table1

将其转换为日期以截断时间,添加一天,将其转回日期时间,减去毫秒...

declare @Test datetime2(3) = '2021-02-16 13:08:58.620';

select dateadd(millisecond, -1, convert(datetime2(3),dateadd(day, 1, convert(date, @Test))));
Result
2021-02-16 23:59:59.999

请注意,如果您直接使用 datetime 而不是 datetime(2),您的准确度只会下降到 3 毫秒。 datetime(2) 是推荐使用的日期时间数据类型。

另一种简单的方法是将您的 datetime 转换为一个日期,然后将它与给定精度的最大可能时间连接起来。如果你想要精确到小数点后 3 位,你需要使用 datetime2(3)

declare @date datetime='20210216 13:08:58.620';

select Convert(datetime2(3),Concat(convert(date,@date),' 23:59:59.999'));

format()

的另一种选择
declare @Test datetime2(3) = '2021-02-16 13:08:58.620';

select convert(datetime2(3),format(@Test,'yyyy-MM-dd 23:59:59.999'))

对于日期时间数据类型,时间的可能最大值为:23:59:59.997

Datetime from MSDN

我们可以使用 DateTimeFromParts 推导当天的最大可能日期时间值。

DECLARE @datevalue datetime = '2021-02-16 13:08:58.620'

SELECT DATETIMEFROMPARTS ( year(@datevalue), month(@datevalue), day(@datevalue), 23, 59, 59, 997 )  as maxPossibleValueForDay 
maxPossibleValueForDay
2021-02-16 23:59:59.997