SQL server 2008,datediff返回错误的值

时间:2012-05-07 12:49:43

标签: sql-server-2008 datediff

我有两列数据类型时间。我正在使用datediff来查找小时数的差异。 问题是当我尝试找到00:00:00到06:00:00之间的差异时,它返回-18。 我该如何解决? 注意:我需要计算更多的差异所以我不能把它除以-3

my function- (datediff(HOUR, startHour, endHour))*60

提前致谢

4 个答案:

答案 0 :(得分:3)

您没有将00:00:0006:00:00进行比较。你有一些日期组件

这给出了-18作为例子

DECLARE @starthour datetime = '00:00:00';
DECLARE @endhour datetime = '18991231 06:00:00';    
SELECT @starthour, @endhour, DATEDIFF(hour, @starthour, @endhour); 

SET @starthour = '20120507 00:00:00';
SET @endhour = '20120506 06:00:00';
SELECT @starthour, @endhour, DATEDIFF(hour, @starthour, @endhour); 

答案 1 :(得分:2)

反转参数:

my function- (datediff(HOUR, endHour, startHour))*60 

编辑:

DATEDIFF功能与日期有关,出于某种原因,它认为你减去了6 AM - 午夜(第二天),即18小时。

以下代码示例在SQL 2008中适用于我,因此您需要检查数据类型以确保使用TIME而不是DATETIME或SMALLDATETIME。

declare @t1 time
set @t1 = '00:00:00'
declare @t2 time 
set @t2 = '06:00:00'

select datediff(hour, @t1, @t2)

-- returns 6

答案 2 :(得分:0)

语法:

DATEDIFF (datepart, startdate, enddate )

示例:

SELECT DATEDIFF(hour, '00:00:00', '06:00:00');  

结果:6

SELECT DATEDIFF(hour, '00:00:00', '06:00:00')*60;  

结果:360

参考 DATEDIFF (Transact-SQL)

答案 3 :(得分:0)

我比赛迟到了,但我遇到了类似的问题。

DATEDIFF(HOUR,'23:00:00','06:00:00')

结果:-17

反转两次(如上面的另一个答案所示)并不代表我想要捕捉的时间范围。我不想知道早上6点到晚上11点之间有多少小时。我想要晚上11点到早上6点。

要解决此问题,请将DATEDIFF()包装在CASE语句中,并在开始时间大于结束时间时添加24:

DECLARE @startTime TIME(0) = '23:00:00';
DECLARE @endTime TIME(0) = '06:00:00';
SELECT CASE WHEN @startTime > @endTime THEN 24 + DATEDIFF(HOUR,@startTime,@endTime) ELSE DATEDIFF(HOUR,@startTime,@endTime) END

结果:7