Sql 计算夜间和白天的班次
我有一个表通勤表,我有3列:Chu in enter PM,Chu out AM,hours:Sql 计算夜间和白天的班次,sql,sql-server,Sql,Sql Server,我有一个表通勤表,我有3列:Chu in enter PM,Chu out AM,hours: ch_in ch_out hours 19:28:35 01:00:00 05:32:00 19:15:54 01:00:00 05:45:00 19:30:08 01:00:00 05:30:00 从夜班到早班的总小时数是错误的,我试图做的是这样一个查询: declare @stdt as datetime ,@enddt as d
ch_in ch_out hours
19:28:35 01:00:00 05:32:00
19:15:54 01:00:00 05:45:00
19:30:08 01:00:00 05:30:00
从夜班到早班的总小时数是错误的,我试图做的是这样一个查询:
declare @stdt as datetime ,@enddt as datetime , @id INT ,@Timediff int ,@ch_num INT;
SET @id=1;
SET @ch_num=(SELECT count(*) FROM commute_table )
WHILE (@id <=@ch_num)
BEGIN
SET @stdt=(SELECT log.ch_in from commute_table log where log.Cou=@id )
SET @enddt=(SELECT log.ch_out from commute_table log where log.Cou=@id )
select @Timediff=datediff(mi,@stdt,@enddt)
update commute_table set hours=(select CONVERT(CHAR(8), DATEADD(MINUTE, @Timediff % 1440, '00:00'), 108)AS Timediff) where Cou=@id
SET @id=@id+1
END
那么,计算这种转变和禁食的最佳方法是什么?或者我的问题出了什么问题
查询是对的,我没有计算。看来实际上你对时间的理解是错误的。在19:28:35和01:00:00之间实际上有5小时31分25秒。如果我们把它分解,首先是31分25秒到20点。然后你还有4个小时到午夜00:00:00,最后还有一个小时到01:00:00,总时间是05:31:25 然而,要回答这个未问到的问题,这个查询的执行速度非常慢,我如何改进它?那是因为你用了一段时间。您最好使用基于集合的解决方案。假设值永远不能超过24小时,则可以执行以下操作:
CREATE TABLE YourTable (ch_in time,
ch_out time,
[hours] time);
INSERT INTO YourTable (ch_in,ch_out)
VALUES('19:28:35','01:00:00'),
('19:15:54','01:00:00'),
('19:30:08','01:00:00');
GO
UPDATE YourTable
SET [hours] = CASE WHEN ch_in > ch_out THEN DATEADD(SECOND, DATEDIFF(SECOND,ch_in, ch_out),CONVERT(time,'00:00:00'))
ELSE DATEADD(SECOND, 86400 - DATEDIFF(SECOND,ch_out, ch_in),CONVERT(time,'00:00:00')) END; --86400 is how many seconds there are in a day
GO
SELECT *
FROM YourTable;
但就我个人而言,我会将小时列为计算列:
ALTER TABLE YourTable DROP COLUMN hours;
GO
ALTER TABLE YourTable ADD [hours] AS CONVERT(time,(CASE WHEN ch_in > ch_out THEN DATEADD(SECOND, DATEDIFF(SECOND,ch_in, ch_out),CONVERT(time,'00:00:00'))
ELSE DATEADD(SECOND, 86400 - DATEDIFF(SECOND,ch_out, ch_in),CONVERT(time,'00:00:00')) END));
SELECT *
FROM YourTable;
您的查询有什么问题?结果在:19:28:35-01:00:00=05:32:00之间错误正确的是04:28:357:30到凌晨1:00是5小时30分钟。为什么04:28:35正确?时间的不同是你的结果集所说的。然而,更好的问题是,为什么要使用WHILE并执行更新RBAR?更新表意味着这对所有人都是正确的?