none
如何取两个日期之间的工作时间? RRS feed

  • 问题

  • 我想取两个日期之间的工作时间,即不包括周六周日,如

    select datediff(hh,'2012-07-27 23:00:00','2012-07-30 00:00:00') 是49(因为中间包含了周日,我想去掉周六和周日),最终要的结果是1

    同理select datediff(hh,'2012-07-27 23:00:00','2012-07-30 00:00:00'),我要的结果也是1

    有没有类似datediff的函数或者自定义函数,能够把周末去掉。



    • 已编辑 zuocl 2012年8月1日 15:23
    2012年8月1日 9:19

答案

全部回复

  • datediff 是日期中,指定部分的差异,不是两个时间的差,这个在函数的说明中已经说明了
    2012年8月1日 11:50
  • 如果你要得到时间之差,可以直接相减的,只是结果要转化一下来看才比较清晰

    参考下面的示例

    DECLARE
    	@dt1 datetime,
    	@dt2 datetime
    ;
    SELECT 
    	@dt1 = '2012-07-27 11:11:00',
    	@dt2 = '2012-07-30 21:00:00'
    ;
    SELECT
    	diff_day = CONVERT(int, diff),
    	diff_time = CONVERT(varchar(10), diff, 108)
    FROM(
    	SELECT
    		diff = @dt2 - @dt1
    )AA
    ;

    2012年8月1日 11:57
  • 参考:

    http://www.cnblogs.com/sinmen/archive/2008/06/07/993091.html

    你可以修改一下,加上时分秒的判断。

    2012年8月1日 13:30
    版主
  • 我现在要得到的是时间差不能包括节假日,如果直接相减就等于把周六和周日算上了。

    比如周五下午和下周一时间之差不包括周六周日的时间,我这个统计要到小时的。

    2012年8月1日 15:20
  • 节假日,你自己建一个表,把节假日的日期都放进去,计算出时间之后,把在这个时间范围内的节假日再减去就行了嘛

    2012年8月2日 0:40
  • 因为计算时间差是到小时的,如果直接减去节假日的天数是不准确的。
    2012年8月2日 1:05
  • 原理是一样的,精确到什么部分,只是取决于你算时间的算法而已,参考这个示例

    DECLARE @tb_节假日 TABLE(
    	开始时间 datetime,
    	结束时间 datetime
    );
    INSERT @tb_节假日
    VALUES
    	( '2012-07-21 00:00:00', '2012-07-22 00:00:00'),
    	( '2012-07-28 00:00:00', '2012-07-29 00:00:00'),
    	( '2012-07-30 00:00:00', '2012-07-31 00:00:00')
    ;
    
    DECLARE
    	@dt1 datetime,
    	@dt2 datetime
    ;
    SELECT 
    	@dt1 = '2012-07-21 11:11:00',
    	@dt2 = '2012-07-30 21:00:00'
    ;
    SELECT
    	diff_day = CONVERT(int, diff),
    	diff_time = CONVERT(varchar(10), CONVERT(datetime, diff), 108)
    FROM(
    	SELECT
    		diff 
    			= CONVERT(decimal(14, 13), @dt2 - @dt1)
    			- (
    				SELECT
    					SUM(
    						CONVERT(
    							decimal(24, 13),
    							CASE
    								WHEN 结束时间 > @dt2 THEN @dt2
    								ELSE 结束时间
    							END
    							-
    							CASE
    								WHEN 开始时间 < @dt1 THEN @dt1
    								ELSE 开始时间
    							END
    						)
    					)
    				FROM @tb_节假日
    				WHERE 结束时间 >= @dt1
    					AND 开始时间 <= @dt2
    			)
    )AA
    

    2012年8月2日 1:56
  • 2012年8月2日 1:58
    版主
  • 我跑了你的例子,diff_time怎么为00:00:00啊?
    2012年8月2日 2:35
  • 关注中  

    给我写信: QQ我:点击这里给我发消息

    2012年8月2日 4:23
  • 我跑了你的例子,diff_time怎么为00:00:00啊?

    你自己调整一下时间试一就知道了嘛,我的例子,开始和结束的那天都在节假日表中,自然 time 部分是不计算的,结果当然就是没有时分秒了
    2012年8月2日 5:16
  • 另外, decimal(24, 13) 定义的精度有些小,可能溢出,你可以改为 decimal(36, 13)
    2012年8月2日 5:17
  • -- 算法:先计算日期差,然后减去周差 * 2
    select datediff(day,'2012-07-27 23:00:00','2012-07-30 00:00:00') - datediff(week,'2012-07-27 23:00:00','2012-07-30 00:00:00') * 2 as N'工作日'

    2012年8月5日 2:16
  • -- 算法:先计算日期差,然后减去周差 * 2
    select datediff(day,'2012-07-27 23:00:00','2012-07-30 00:00:00') - datediff(week,'2012-07-27 23:00:00','2012-07-30 00:00:00') * 2 as N'工作日'

    确实可以

    给我写信: QQ我:点击这里给我发消息

    2012年8月5日 16:51
  • 如果这样

    select datediff(day,'2012-07-27 23:00:00','2012-07-29 00:00:00') - datediff(week,'2012-07-27 23:00:00','2012-07-29 00:00:00') * 2 as N'工作日'

    显示0个工作日

    还是不行


    给我写信: QQ我:点击这里给我发消息

    2012年8月5日 16:56