将时间 23:59:59.999 添加到结束日期之间

问题描述 投票:0回答:10

我在使用以下内容时遇到问题:

Column_Name BETWEEN @StartDate AND @EndDate. 

这是因为当时的 @EndDate = 00:00:00.000,它不会获取当天的所有值。

如何将 @EndDate(始终 00:00:00.000)转换为始终为 Date + 23:59:59.999?

sql sql-server sql-server-2005
10个回答
48
投票

避免添加 EndDate + 23:59:59.999 的一个选项是不使用

between
比较,而是使用
column_name >= @StartDate and column_name < @EndDate +1


18
投票

请注意 SQL Server 2005 中 DATETIME 类型的准确性和舍入:

日期时间值四舍五入为 0.000、0.003 或 0.007 秒的增量

SQL Server 2008 引入了 DATETIME2 类型,其精度为 100 纳秒。所以在 SQL Server 2008 中你可以这样做:

DECLARE @d DATETIME = '2011-10-07 00:00:00.000'
SELECT DATEADD(MS, -1, DATEADD(D, 1, CONVERT(DATETIME2, @d)))

或者,在这种情况下,您可能希望避免使用 BETWEEN 运算符:

@StartDate <= Column_Name AND Column_Name < DATEADD(D, 1, @EndDate)

8
投票

您可以像这样更改日期中的时间(我使用

getdate()
作为示例):

select cast(convert(char(8), getdate(), 112) + ' 23:59:59.99' as datetime)

说明:

convert(char(8), getdate(), 112)
将日期转换为
yyyymmdd
格式(作为字符串)。

然后您可以附加所需的时间,并将整个字符串再次转换为

datetime


编辑:

当您在数据库列上进行转换时,它会降低性能,是的。
但他有一个日期时间变量,他只是使用转换来更改变量中的时间一次
--> 如果他使用我的代码更改他的

@EndDate
变量,我认为不会出现性能问题。

不过,这是正确的观点。选角并不是在所有情况下都是一个好的解决方案。


8
投票
自从

datetime2

数据类型出现以来,我一直在努力解决这个问题。为了将一天的结束计算为 datetime2 数据类型,我将一天中的秒数添加到 =date=,然后减去 100 纳秒。瞧:

declare @bod datetime2 declare @eod datetime2 set @bod = cast (GETDATE() as DATE) set @eod = DATEADD(ns, -100, DATEADD(s, 86400, @bod)) print @bod print @eod -- answer: 2013-12-01 00:00:00.0000000 2013-12-01 23:59:59.9999999

现在我要开始讨论

datetimeoffset

 数据类型了。


4
投票
你也可以这样做:

select @endDate = dateadd(ms,-3,dateadd(day,1,DATEADD(dd, DATEDIFF(dd,0,@endDate), 0)))

当@endDate 为“5/3/2013”时


4
投票
--Execution / post date is 1 Feb. 2020 -- sql server this month start and end select DATEADD(month, DATEDIFF(month, 0, getdate()), 0) -- 2020-02-01 00:00:00.000 select DATEADD(second,-1, datediff(day,0,EOMONTH(getdate()))+1) -- 2020-02-29 23:59:59.000 -- sql server this day start and end select DATEADD(day, DATEDIFF(day, 0, getdate()), 0) -- 2020-02-01 00:00:00.000 select DATEADD(second,-1, datediff(dd,0,getdate())+1) -- 2020-02-01 23:59:59.000 -- sql server last 30 days start and end select DATEADD(day, -30, DATEDIFF(day, 0, getdate())) -- 2020-01-02 00:00:00.000 select DATEADD(second,-1, datediff(dd,0,getdate())+1) -- 2020-02-01 23:59:59.000
    

1
投票
如果您的结束日期设置为第二天的

between

,则可以使用 
00:00:00

ColumnName between @StartDate and convert(datetime, convert(date, @EndDate + 1))



这会将第二天转换为

date

,删除小时信息,然后将其转换回 
datetime
,添加默认小时信息:
00:00:00


1
投票
您可以使用零件函数中日期的任何变体。例如,让我们使用

DATETIMEFROMPARTS:

DECLARE @d DATETIME2(0) = '2011-10-07 04:32:12.000'; SELECT DATETIMEFROMPARTS(YEAR(@d), MONTH(@d), DAY(@d), 23, 59, 59, 0); -- 2011-10-07 23:59:59
    

0
投票
您可以简单地去掉原来的时间指示栏。例如。如果它是某个日期的交货单或发票......具有日期时间戳记,您可以将其转换/转换为仅日期。这样你就可以查找 >= @datefrom 和

= @datefrom 并强制转换('Datetimefield' as date) <= @dateto will work. like where cast('Datetimefield' as date) > <= @dateto


-2
投票
我首先将原始日期时间转换为一天的开始,然后添加小时和秒:

声明@开始日期时间,@结束日期时间

设置@start = DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)

SET @end = DATEADD(HOUR, 23, DATEADD(n, 59, @start))

打印@开始

打印@结束

2017 年 10 月 27 日 12:00

2017 年 10 月 27 日 11:59

© www.soinside.com 2019 - 2024. All rights reserved.