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
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)
您可以像这样更改日期中的时间(以我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
数据类型。
归档时间: |
|
查看次数: |
74690 次 |
最近记录: |