DATEDIFF
可以给你一些奇怪的结果。 例如采取这种两DATETIME2
(我相信你有SQL Server 2008中)有5分钟的差值:
SELECT DATEDIFF(hh,'2011-01-01 04:59:00','2011-01-01 05:04:00')
Results
-----------
1
结果是莫名其妙奇怪:1小时。奇怪,因为分钟的差异是5分钟,但是小时的差别是1小时,我们知道1小时= 60分钟。请阅读此article以查看解释。
解决方案:
1)代替DATEDIFF(hh,...)
使用DATEDIFF(mi,...)
例:
SELECT DATEDIFF(mi,'2011-01-01 07:55:00','2011-01-01 16:02:00') [Minutes]
,DATEDIFF(mi,'2011-01-01 07:55:00','2011-01-01 16:02:00')/60 [Hours]
--8 hours
,DATEDIFF(mi,'2011-01-01 07:55:00','2011-01-01 16:02:00')%60 [Additional minute]
--7 minute
但:
SELECT DATEDIFF(mi,'2011-01-01 08:00:59','2011-01-01 16:00:05') [Minutes]
--480
,DATEDIFF(ss,'2011-01-01 08:00:59','2011-01-01 16:00:05')/60 [Seconds/60]
--479
2)而不是使用DATEDIFF
功能(带DATETIME[2][OFFSET]
数据类型)的使用 - 运营商的DATETIME
值:
个
DECLARE @Test TABLE
(
TestId INT IDENTITY(1,1) PRIMARY KEY
,[Enter] DATETIME NOT NULL
,[Exit] DATETIME NOT NULL
);
INSERT @Test
VALUES ('2011-01-01 07:55:00','2011-01-01 16:02:02')
,('2011-01-01 08:00:59','2011-01-01 16:00:05');
SELECT *
,t.[Exit] - t.[Enter] AS MyDateDiff
,DATEPART(hh,t.[Exit] - t.[Enter]) [Hours]
,DATEPART(mi,t.[Exit] - t.[Enter]) [Additional minutes]
,DATEPART(ss,t.[Exit] - t.[Enter]) [Additional seconds]
FROM @Test t
结果:
TestId Enter Exit MyDateDiff Hours Additional minute Additional seconds
----------- ----------------------- ----------------------- ----------------------- ----------- ----------------- ------------------
1 2011-01-01 07:55:00.000 2011-01-01 16:02:02.000 1900-01-01 08:07:02.000 8 7 2
2 2011-01-01 08:00:59.000 2011-01-01 16:00:05.000 1900-01-01 07:59:06.000 7 59 6
您正在使用哪个版本的SQL Server? –
SQL Server 2005 – Soony
如果午夜在当前工作会话之间,该怎么办?整个工作时间都在计算工人开始工作的那一天或他结束工作的那一天,还是你必须在午夜之前分工? –