Sql server 2008 SQL server 2008,datediff返回错误的值

Sql server 2008 SQL server 2008,datediff返回错误的值,sql-server-2008,datediff,Sql Server 2008,Datediff,我有两列数据类型time。我正在使用datediff查找小时数的差异。 问题是,当我尝试查找00:00:00到06:00:00之间的差异时,它返回-18。 我怎样才能修好它? 注意:我需要用这个来计算更多的差值,所以我不能用-3来除以它 my function- (datediff(HOUR, startHour, endHour))*60 提前感谢反转参数: my function- (datediff(HOUR, endHour, startHour))*60 编辑: DATEDIFF

我有两列数据类型time。我正在使用datediff查找小时数的差异。 问题是,当我尝试查找00:00:00到06:00:00之间的差异时,它返回-18。 我怎样才能修好它? 注意:我需要用这个来计算更多的差值,所以我不能用-3来除以它

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

提前感谢

反转参数:

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

DATEDIFF函数与日期一起工作,出于某种原因,它认为你减去了早上6点到午夜(第二天),也就是18小时

下面的代码示例在SQL 2008中非常适用,因此您需要检查数据类型以确保使用的是时间,而不是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
语法: 示例: 结果:6

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


请参阅您没有将
00:00:00
06: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); 

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

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除以-3只能得到正确的结果。将06:00:00替换为07:00:00,你就会明白我的意思。你能发布一些代码和数据来说明问题吗?测试您所说的内容会得到
6
。什么数据类型是startHour和endHour?在我(显然是因为长时间阅读数学而扭曲)的眼中,
-18
6
模式下工作时是相同的。与
17:00
5:00
非常相似,当一个人在
mod 12
模式下工作时是一样的。如果上面的注释不清楚:对结果执行
mod 24
操作。我试图将其反转,但它只返回了18。无论如何,我需要用它计算更多的时间差。gbn-startHour和endHour来自我使用的数据类型time。当我这样尝试时,我得到了6,但当我从表中提取时,我得到了18。你能发布你的表结构吗,从SQL Mgmt Studio编写的脚本?谢谢,但是startHour和endHour来自数据类型time hh:mm:ss,没有date@user1232948:请检查并再次检查:我刚刚演示了如何获得-18…我不想要-18或18,我想要6:)@user1232948:嗯,你不能,因为你在开始值之前有一个结束值。简单。这是获得负值的唯一方法…@user1232948您确定哪一行会给您带来麻烦吗?因为
18:00-00:00
将为您提供
-18
DATEDIFF(HOUR,'23:00:00','06:00:00')
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