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

mam*_*esh 19 sql sql-server sql-server-2005

我一直遇到使用以下问题:

Column_Name BETWEEN @StartDate AND @EndDate. 
Run Code Online (Sandbox Code Playgroud)

这是因为@EndDate = 00:00:00.000的时间,它没有获取当天的所有值.

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

dav*_*ave 34

避免需要添加EndDate + 23:59:59.999的一个选项是不使用between比较而是使用column_name >= @StartDate and column_name < @EndDate +1

  • 无论如何,+`EndDate + 23:59:59.999`将被调整到第二天.为了避免这种情况,需要`EndDate + 23:59:59.997`. (15认同)
  • 我仍然会使用`和column_name <DATEADD(Day,1,@ EndDate)来避免隐式转换. (9认同)
  • 我给它+1了,但不要做"@EndDate + 1".使用dateadd可以明确说明要添加到日期时间的单位. (4认同)
  • 请记住,隐式转换是一个性能问题,它是一个"我想要的"问题.如果由于某种原因,您的@enddate变量是varchar而不是datetime,它将无法按预期工作.我被教导的规则是永远不要依赖隐式转换. (4认同)

Tom*_*ter 11

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

datetime值四舍五入为.000,.003或.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)))
Run Code Online (Sandbox Code Playgroud)

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

@StartDate <= Column_Name AND Column_Name < DATEADD(D, 1, @EndDate)
Run Code Online (Sandbox Code Playgroud)


Chr*_*cht 5

您可以像这样更改日期中的时间(以我getdate()为例):

select cast(convert(char(8), getdate(), 112) + ' 23:59:59.99' as datetime)
Run Code Online (Sandbox Code Playgroud)

解释:

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

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


编辑:

当您对数据库列进行转换时,它会降低性能,是的。
但是他有一个 datetime变量,他只是使用强制转换来更改变量中的时间一次
--> 如果他使用我的代码来更改他的@EndDate变量,我看不到性能问题。

然而,有效点。铸造并不是在所有情况下都是一个好的解决方案。


小智 5

你也可以这样做:

select @endDate = dateadd(ms,-3,dateadd(day,1,DATEADD(dd, DATEDIFF(dd,0,@endDate), 0)))
Run Code Online (Sandbox Code Playgroud)

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


小智 5

自从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
Run Code Online (Sandbox Code Playgroud)

现在我要讲datetimeoffset数据类型。