2012-01-28 49 views
0

我在SQL SERVER中获取日期的计数有点麻烦。我需要包含两个日期开始日期和结束日期之间的日历天数。用下面的例子的问题是,它总是返回10时,我认为它应该是11DATEADD与部分日期

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

+0

感谢大家的回答; upvote for everyone :) – 2012-01-29 00:40:56

回答

2

新的东西是可以解决的时间,日期,SMALLDATETIME, DATETIME,DATETIME2,DATETIMEOFFSET或值的表达式。日期可以是 表达式,列表达式,用户定义的变量或字符串 的文字。 startdate从结束日期中减去。

这是取自MSDN here

28-18 = 10.我想你会因为DATEDIFF的定义而不得不在你的场景中加1。

1

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

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

谢谢,但日期是一个例子 - 它们不会被正常修复,并且示例值可能会发生。理想情况下,解决方案将在00:00:00时间内设置:) – 2012-01-28 12:53:43

+0

我们所做的是忽略时间,并始终将开始日期的时间设置为0:00:00,并将结束日期设置为23:59:59在两个日期之间需要选择的计算或查询类型。 – ozczecho 2012-01-28 12:58:13

1

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

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

编辑:

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

好像又回到同样的结果,这的确会使它做的更优雅的方式。总是认为DATEDIFF时间部分在计算后会被截断(如果开始时间晚于结束时间,将会给出错误结果),并且不会在为您的情况提供正确结果的计算之前截断。你好好学习天天向上:)

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小时×60分钟x 60秒