我在使用以下内容时遇到了问题:
Column_Name BETWEEN @StartDate AND @EndDate.
这是因为@EndDate = 00:00:00.000的时间,它没有获取当天的所有值。
我如何将@EndDate(总是00:00:00.000)转换为始终为Date + 23:59:59.999?
答案 0 :(得分:31)
避免需要添加EndDate + 23:59:59.999的一个选项是不使用between
比较,而是使用column_name >= @StartDate and column_name < @EndDate +1
答案 1 :(得分:10)
请注意SQL Server 2005中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)))
或者,您可能希望在这种情况下避免使用BETWEEN运算符:
@StartDate <= Column_Name AND Column_Name < DATEADD(D, 1, @EndDate)
答案 2 :(得分:4)
自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
数据类型。
答案 3 :(得分:3)
您可以更改此日期的时间(我使用getdate()
作为示例):
select cast(convert(char(8), getdate(), 112) + ' 23:59:59.99' as datetime)
说明:
convert(char(8), getdate(), 112)
将日期转换为yyyymmdd
格式(作为字符串)。
然后您可以添加所需的时间,并将整个字符串再次转换为datetime
。
编辑:
在数据库列上进行投射时,它会降低性能,是的
但他有一个日期时间变量,他只使用转换来改变变量中的时间
- &GT;如果他使用我的代码更改@EndDate
变量,我认为没有性能问题。
有效点。在所有情况下,铸造都不是一个好的解决方案。
答案 4 :(得分:3)
你也可以这样做:
select @endDate = dateadd(ms,-3,dateadd(day,1,DATEADD(dd, DATEDIFF(dd,0,@endDate), 0)))
当@endDate为'5/3/2013'时
答案 5 :(得分:1)
如果您的结束日期设置为第二天的between
,则可以使用00:00:00
:
ColumnName between @StartDate and convert(datetime, convert(date, @EndDate + 1))
这会将第二天转换为date
,这会删除小时信息,然后将其转换回datetime
,这会添加默认小时信息:00:00:00
。
答案 6 :(得分:1)
--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
答案 7 :(得分:-1)
我首先将原始日期时间转换为当天的开始时间,然后为其添加小时和秒:
DECLARE @start DATETIME,@ end DATETIME
SET @start = DATEADD(DAY,DATEDIFF(DAY,0,GETDATE()),0)
SET @end = DATEADD(HOUR,23,DATEADD(n,59,@ start))
PRINT @start
PRINT @end
2017年10月27日12:00 AM
2017年10月27日晚上11:59