Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 计算夜间和白天的班次_Sql_Sql Server - Fatal编程技术网

Sql 计算夜间和白天的班次

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

我有一个表通勤表,我有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 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?更新表意味着这对所有人都是正确的?