• 主页
  • 基础类
  • 应用实例
  • 新技术前沿

超期统计sql

lishery 2015-08-03 02:48:38
超期统计,一张表有字段 id,规定完成日期,实际完成日期

实际完成日期超期满一个小时算超期一天,如规定完成日期2015-01-01 10:00:00 ,实际完成日期2015-01-01 11:00:00,算超期一天;规定完成日期2015-01-01 10:00:00 ,实际完成日期2015-01-02 11:00:00,算超期二天,求sql代码
...全文
183 点赞 收藏 12
写回复
12 条回复
Tiger_Zhao 2015年08月05日
满24小时居然不多算一天。
随便你,少算一小时就好
WITH table1(id,规定完成日期,实际完成日期) AS (
SELECT 1, '2015-01-01 10:00:00', '2015-01-01 10:00:00' UNION ALL
SELECT 2, '2015-01-01 10:00:00', '2015-01-01 10:59:00' UNION ALL
SELECT 3, '2015-01-01 10:00:00', '2015-01-01 11:00:00' UNION ALL
SELECT 4, '2015-01-01 10:00:00', '2015-01-01 23:00:00' UNION ALL
SELECT 5, '2015-01-01 10:00:00', '2015-01-02 00:00:00' UNION ALL
SELECT 6, '2015-01-01 10:00:00', '2015-01-02 10:00:00' UNION ALL
SELECT 7, '2015-01-01 10:00:00', '2015-01-02 10:59:00' UNION ALL
SELECT 8, '2015-01-01 10:00:00', '2015-01-02 11:00:00'
)
SELECT *,
CASE WHEN 实际完成日期<=规定完成日期 THEN
0
ELSE
(DATEDIFF(hour,规定完成日期,实际完成日期)+23)/24
END 超期天数
FROM table1

         id 规定完成日期        实际完成日期        超期天数
----------- ------------------- ------------------- -----------
1 2015-01-01 10:00:00 2015-01-01 10:00:00 0
2 2015-01-01 10:00:00 2015-01-01 10:59:00 0
3 2015-01-01 10:00:00 2015-01-01 11:00:00 1
4 2015-01-01 10:00:00 2015-01-01 23:00:00 1
5 2015-01-01 10:00:00 2015-01-02 00:00:00 1
6 2015-01-01 10:00:00 2015-01-02 10:00:00 1
7 2015-01-01 10:00:00 2015-01-02 10:59:00 1
8 2015-01-01 10:00:00 2015-01-02 11:00:00 2
回复 点赞
lishery 2015年08月05日
引用 10 楼 Tiger_Zhao 的回复:
2015-01-02 09:00 是同一天,算1天; 2015-01-02 10:00 已经是第二天了啊,算2天没错啊。
实际完成日期超期满一个小时算超期一天 如规定完成日期2015-01-01 10:00:00 ,实际完成日期2015-01-01 11:00:00,算超期一天 规定完成日期2015-01-01 10:00:00 ,实际完成日期2015-01-02 10:30:00,算超期一天 规定完成日期2015-01-01 10:00:00 ,实际完成日期2015-01-02 11:00:00,算超期二天 除了比较日期外,时间超过一个小时候 超期+1天,不满一个小时不额外+1天
回复 点赞
Tiger_Zhao 2015年08月05日
2015-01-02 09:00 是同一天,算1天;
2015-01-02 10:00 已经是第二天了啊,算2天没错啊。
回复 点赞
lishery 2015年08月05日
引用 8 楼 Tiger_Zhao 的回复:
/* 测试数据
WITH table1(id,规定完成日期,实际完成日期) AS (
    SELECT 1, '2015-01-01 10:00:00', '2015-01-01 09:00:00' UNION ALL
    SELECT 2, '2015-01-01 10:00:00', '2015-01-01 10:00:00' UNION ALL
    SELECT 3, '2015-01-01 10:00:00', '2015-01-01 11:00:00' UNION ALL
    SELECT 4, '2015-01-01 10:00:00', '2015-01-01 23:00:00' UNION ALL
    SELECT 5, '2015-01-01 10:00:00', '2015-01-02 00:00:00' UNION ALL
    SELECT 6, '2015-01-01 10:00:00', '2015-01-02 09:00:00' UNION ALL
    SELECT 7, '2015-01-01 10:00:00', '2015-01-02 10:00:00' UNION ALL
    SELECT 8, '2015-01-01 10:00:00', '2015-01-02 11:00:00'
) */
SELECT *,
       CASE WHEN 实际完成日期<=规定完成日期 THEN
            0
       ELSE
            (DATEDIFF(hour,规定完成日期,实际完成日期)/24)+1
       END 超期天数
  FROM table1
         id 规定完成日期        实际完成日期        超期天数
----------- ------------------- ------------------- -----------
          1 2015-01-01 10:00:00 2015-01-01 09:00:00           0
          2 2015-01-01 10:00:00 2015-01-01 10:00:00           0
          3 2015-01-01 10:00:00 2015-01-01 11:00:00           1
          4 2015-01-01 10:00:00 2015-01-01 23:00:00           1
          5 2015-01-01 10:00:00 2015-01-02 00:00:00           1
          6 2015-01-01 10:00:00 2015-01-02 09:00:00           1
          7 2015-01-01 10:00:00 2015-01-02 10:00:00           2
          8 2015-01-01 10:00:00 2015-01-02 11:00:00           2
7 2015-01-01 10:00:00 2015-01-02 10:00:00 2 这条错误
回复 点赞
lishery 2015年08月04日
引用 6 楼 Landa_Ran 的回复:
这个应该可以了
select *,DATEDIFF(HOUR,[规定完成日期],[实际完成日期])/24+1
from table1
不对,,
回复 点赞
Tiger_Zhao 2015年08月04日
/* 测试数据
WITH table1(id,规定完成日期,实际完成日期) AS (
SELECT 1, '2015-01-01 10:00:00', '2015-01-01 09:00:00' UNION ALL
SELECT 2, '2015-01-01 10:00:00', '2015-01-01 10:00:00' UNION ALL
SELECT 3, '2015-01-01 10:00:00', '2015-01-01 11:00:00' UNION ALL
SELECT 4, '2015-01-01 10:00:00', '2015-01-01 23:00:00' UNION ALL
SELECT 5, '2015-01-01 10:00:00', '2015-01-02 00:00:00' UNION ALL
SELECT 6, '2015-01-01 10:00:00', '2015-01-02 09:00:00' UNION ALL
SELECT 7, '2015-01-01 10:00:00', '2015-01-02 10:00:00' UNION ALL
SELECT 8, '2015-01-01 10:00:00', '2015-01-02 11:00:00'
) */
SELECT *,
CASE WHEN 实际完成日期<=规定完成日期 THEN
0
ELSE
(DATEDIFF(hour,规定完成日期,实际完成日期)/24)+1
END 超期天数
FROM table1

         id 规定完成日期        实际完成日期        超期天数
----------- ------------------- ------------------- -----------
1 2015-01-01 10:00:00 2015-01-01 09:00:00 0
2 2015-01-01 10:00:00 2015-01-01 10:00:00 0
3 2015-01-01 10:00:00 2015-01-01 11:00:00 1
4 2015-01-01 10:00:00 2015-01-01 23:00:00 1
5 2015-01-01 10:00:00 2015-01-02 00:00:00 1
6 2015-01-01 10:00:00 2015-01-02 09:00:00 1
7 2015-01-01 10:00:00 2015-01-02 10:00:00 2
8 2015-01-01 10:00:00 2015-01-02 11:00:00 2
回复 点赞
许晨旭 2015年08月03日
这个应该可以了
select *,DATEDIFF(HOUR,[规定完成日期],[实际完成日期])/24+1
from table1
回复 点赞
lishery 2015年08月03日
引用 4 楼 yooq_csdn 的回复:
[quote=引用 3 楼 lishery 的回复:] [quote=引用 1 楼 yooq_csdn 的回复:]


select DATEDIFF(dd,DATEADD(hh,1,规定完成日期),实际完成日期)+1
from table
不超期的也限制超期一天了[/quote]

select DATEDIFF(dd,DATEADD(hh,1,规定完成日期),实际完成日期)+1
from table
where 实际完成日期>=DATEADD(hh,1,规定完成日期)
[/quote] 不超期的也要统计,显示0
回复 点赞
yooq_csdn 2015年08月03日
引用 3 楼 lishery 的回复:
[quote=引用 1 楼 yooq_csdn 的回复:]


select DATEDIFF(dd,DATEADD(hh,1,规定完成日期),实际完成日期)+1
from table
不超期的也限制超期一天了[/quote]

select DATEDIFF(dd,DATEADD(hh,1,规定完成日期),实际完成日期)+1
from table
where 实际完成日期>=DATEADD(hh,1,规定完成日期)
回复 点赞
lishery 2015年08月03日
引用 1 楼 yooq_csdn 的回复:


select DATEDIFF(dd,DATEADD(hh,1,规定完成日期),实际完成日期)+1
from table
不超期的也限制超期一天了
回复 点赞
许晨旭 2015年08月03日
select *,DATEDIFF(HOUR,[规定完成日期],[实际完成日期])
from table1
where DATEDIFF(HOUR,[规定完成日期],[实际完成日期])>1
回复 点赞
yooq_csdn 2015年08月03日


select DATEDIFF(dd,DATEADD(hh,1,规定完成日期),实际完成日期)+1
from table
回复 点赞
发动态
发帖子
MS-SQL Server
创建于2007-09-28

1.4w+

社区成员

25.3w+

社区内容

MS-SQL Server相关内容讨论专区
社区公告
暂无公告