DATEADD与部分日

时间:2012-01-28 12:43:27

标签: sql-server

我在SQL SERVER中获取日期计数时遇到了一些麻烦。我要求包括两个日期开始和结束日期之间的日历天数。以下示例的问题是,当我认为它应该是11时,它总是返回10.

DECLARE @FROM DATETIME, @TO DATETIME
SET @FROM = '18/12/2011 00:00:00'
SET @TO = '28/12/2011 00:00:00'

SELECT 
    DATEDIFF(MINUTE,@FROM,@TO), -- Returns 14459
    DATEDIFF(HOUR,@FROM,@TO), -- Returns 241
    DATEDIFF(DAY,@FROM,@TO), -- Returns 10
    CEILING(CAST((DATEDIFF(HOUR,@FROM,@TO) / 24) as DECIMAL(9,5))) --Returns 10
    CEILING(CAST(CEILING(CEILING(CAST(DATEDIFF(SECOND,@FROM,@TO) as DECIMAL(18,5))) / 60) / 60 as DECIMAL(9,5)) / 24) --Returns 10

如果时间间隔至少有1秒,则底线有效但我必须考虑所有情况。

我唯一的另一个想法是简单地在日期差异中添加一个来计算部分日期?那可靠吗?

DATEDIFF(DAY,@FROM,@TO) + 1

我在回答这个问题时遇到了How to find the total between the dates for each values

4 个答案:

答案 0 :(得分:2)

  

是一个可以解析为time,date,smalldatetime的表达式,   datetime,datetime2或datetimeoffset值。日期可以是   表达式,列表达式,用户定义的变量或字符串   文字。从结束日期开始减去startdate。

这取自MSDN here

28-18 = 10.由于DATEDIFF的定义,我认为你必须在你的场景中加1。

答案 1 :(得分:1)

您需要将@TO日期设置为:

SET @TO = '28/12/2011 23:59:59'

答案 2 :(得分:1)

要获取两个日期之间的天数(忽略时间),包括开始日期和结束日期,请尝试;

SELECT FLOOR(CONVERT(FLOAT, @TO))-FLOOR(CONVERT(FLOAT, @FROM))+1

编辑:

SELECT DATEDIFF(d, @FROM, @TO)+1

似乎返回完全相同的结果,这确实会使它成为一种更优雅的方式。一直认为DATEDIFF时间段是关于计算后的截断(如果开始时间是在当天晚些时候比结束时间那么会产生错误的结果)并且在计算之前不截断,从而为您的案例提供正确的结果。你每天都学到新东西:)

答案 3 :(得分:1)

如果您想要与C#DateTime.TotalDays()函数等效近似(即知道小数天),您可以使用以下内容:

DECLARE @start DATETIME = '10 Apr 2012 15:00'
DECLARE @end DATETIME = '12 Apr 2012 16:00'

SELECT CONVERT(FLOAT, DATEDIFF(SECOND, @start, @end)) / 86400

*注意:86400 =一天中的秒数= 24小时x 60分钟x 60秒