日期之间的差异sql-忽略星期六星期日

Posted

技术标签:

【中文标题】日期之间的差异sql-忽略星期六星期日【英文标题】:Difference between dates sql- ignore saturday sunday 【发布时间】:2018-03-12 07:37:35 【问题描述】:

我需要编写一个过程,如果我的实际日期超过 3 天,我需要更新 ACTUAL_FINISH 日期。这三天不考虑周六周日。

select *
from MILESTONE_SCHEDULE
WHERE MILESTONE_TYPE_ID = 398
  and ACTUAL_FINISH IS NULL
  AND ACTUAL_START IS NOT NULL;

【问题讨论】:

填充Calendar 表并加入它以计算工作日。 Count work days between two dates的可能重复 【参考方案1】:

假设您在 MILESTONE_SCHEDULE 表中有一个唯一的 ID,要实现您正在寻找的内容,您可以尝试如下。

UPDATE T
SET ACTUAL_FINISH = GETDATE()--or whatever you want
FROM MILESTONE_SCHEDULE T
INNER JOIN
(    
   SELECT ID,
   (DATEDIFF(dd, ACTUAL_START, GETDATE()) )
  -(DATEDIFF(wk, ACTUAL_START, GETDATE()) * 2)
  -(CASE WHEN DATENAME(dw, ACTUAL_START) = 'Sunday' THEN 1 ELSE 0 END)
  -(CASE WHEN DATENAME(dw, GETDATE()) = 'Saturday' THEN 1 ELSE 0 END) AS DayDif
  FROM MILESTONE_SCHEDULE T
  ) T1
  ON T1.ID= T.ID
WHERE T1.DayDif > 3
AND T.MILESTONE_TYPE_ID = 398
AND T.ACTUAL_FINISH IS NULL
AND T.ACTUAL_START IS NOT NULL;

虚拟数据示例

以下查询将有助于更新值。

DECLARE @MILESTONE_SCHEDULE TABLE(ID INT ,ACTUAL_START DATETIME ,ACTUAL_FINISH DATETIME)

INSERT INTO @MILESTONE_SCHEDULE
VALUES(1,GETDATE()-10,NULL),(2,GETDATE(),NULL)     

UPDATE T
SET ACTUAL_FINISH = GETDATE()
FROM @MILESTONE_SCHEDULE T
INNER JOIN
(    
   SELECT ID,
   (DATEDIFF(dd, ACTUAL_START, GETDATE()) )
  -(DATEDIFF(wk, ACTUAL_START, GETDATE()) * 2)
  -(CASE WHEN DATENAME(dw, ACTUAL_START) = 'Sunday' THEN 1 ELSE 0 END)
  -(CASE WHEN DATENAME(dw, GETDATE()) = 'Saturday' THEN 1 ELSE 0 END) AS DayDif
  FROM @MILESTONE_SCHEDULE T
  ) T1
  ON T1.ID= T.ID
WHERE T1.DayDif > 3

SELECT * FROM @MILESTONE_SCHEDULE

输出:

ID  ACTUAL_START                ACTUAL_FINISH
1   2018-03-02 11:26:25.707     2018-03-12 11:26:25.707
2   2018-03-12 11:26:25.707     NULL

【讨论】:

查询是纯sql,你可以在oracle上找到等价的DATEDIFF并轻松转换。 UPDATE T SET ACTUAL_FINISH = SYSTIMESTAMP——或者任何你想要的从 MILESTONE_SCHEDULE T INNER JOIN (SELECT ID, (dd- ACTUAL_START, SYSTIMESTAMP)) -(wk- ACTUAL_START, SYSTIMESTAMP) * 2) -( CASE WHEN TO_CHAR(ACTUAL_START, 'dw') = 'Sunday' THEN 1 ELSE 0 END) -(CASE WHEN TO_CHAR(SYSTIMESTAMP, 'dw') = 'Saturday' THEN 1 ELSE 0 END) AS DayDif FROM MILESTONE_SCHEDULE T ) T1 ON T1.ID= T.ID WHERE T1.DayDif > 3 AND T.MILESTONE_TYPE_ID = 398 AND T.ACTUAL_FINISH 为 NULL 且 T.ACTUAL_START 不为 NULL; 您同时标记了 SQL Server 和 Oracle,因此您可能无法轻松获得响应。建议您仅针对 oracle 标签提出另一个更详细的问题。你可能会得到帮助。

以上是关于日期之间的差异sql-忽略星期六星期日的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句计算两个日期之间有多少个工作日的方法

计算两个特定日期之间有多少个星期五(或任何一个)?

如何删除两个日期之间的星期六和星期日并计算总天数[重复]

在sql中怎样获得已知日期是星期几

MYSQL经典SQL之星期问题

SQL 如何得到本月第一个星期天的日期