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

时间:2011-10-07 19:03:51

标签: sql sql-server sql-server-2005

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

Column_Name BETWEEN @StartDate AND @EndDate. 

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

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

8 个答案:

答案 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