我在使用以下内容时遇到问题:
Column_Name BETWEEN @StartDate AND @EndDate.
这是因为当时的 @EndDate = 00:00:00.000,它不会获取当天的所有值。
如何将 @EndDate(始终 00:00:00.000)转换为始终为 Date + 23:59:59.999?
避免添加 EndDate + 23:59:59.999 的一个选项是不使用
between
比较,而是使用 column_name >= @StartDate and column_name < @EndDate +1
请注意 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)
您可以像这样更改日期中的时间(我使用
getdate()
作为示例):
select cast(convert(char(8), getdate(), 112) + ' 23:59:59.99' as datetime)
说明:
convert(char(8), getdate(), 112)
将日期转换为 yyyymmdd
格式(作为字符串)。
然后您可以附加所需的时间,并将整个字符串再次转换为
datetime
。
编辑:
当您在数据库列上进行转换时,它会降低性能,是的。
但他有一个日期时间变量,他只是使用转换来更改变量中的时间一次
--> 如果他使用我的代码更改他的
@EndDate
变量,我认为不会出现性能问题。
不过,这是正确的观点。选角并不是在所有情况下都是一个好的解决方案。
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
数据类型了。
select @endDate = dateadd(ms,-3,dateadd(day,1,DATEADD(dd, DATEDIFF(dd,0,@endDate), 0)))
当@endDate 为“5/3/2013”时
--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
between
,则可以使用
00:00:00
:
ColumnName between @StartDate and convert(datetime, convert(date, @EndDate + 1))
date
,删除小时信息,然后将其转换回
datetime
,添加默认小时信息:
00:00:00
。
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
= @datefrom 并强制转换('Datetimefield' as date) <= @dateto will work. like where cast('Datetimefield' as date) > <= @dateto
声明@开始日期时间,@结束日期时间
设置@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