SQL 日期差异工作日

标签 sql sql-server

我需要计算 datediff <= 1 的所有订单。我使用 COALESCE 函数,因为有时 Date1 可能为空。

SELECT COUNT(*)
FROM Orders
WHERE DATEDIFF(dd,COALESCE(Date1, Date2),Date0) <= 1

有没有办法只计算工作日(周一至周五)?

谢谢。

最佳答案

您可以使用 Calendar表并将所有工作日存储在其中。

或者,您可以使用以下简单公式来计算两个日期之间的工作日数。该公式假设星期六和星期日不是工作日。它假设两个给定日期是工作日。

它所做的只是计算正常的天数差异,然后从每周开始的结果中减去 2(非营业)天。


示例 1

DECLARE @Date0 date = '2016-04-07'; -- Thursday
DECLARE @Date1 date = '2016-04-08'; -- Friday

SELECT
    DATEDIFF(day, @Date0, @Date1) - 
    DATEDIFF(week, @Date0, @Date1) * 2 AS BusinessDays;

结果

BusinessDays
1

示例 2

DECLARE @Date0 date = '2016-04-08'; -- Friday
DECLARE @Date1 date = '2016-04-11'; -- Monday

SELECT
    DATEDIFF(day, @Date0, @Date1) - 
    DATEDIFF(week, @Date0, @Date1) * 2 AS BusinessDays;

结果

BusinessDays
1

示例3

DECLARE @Date0 date = '2016-04-08'; -- Friday
DECLARE @Date1 date = '2016-04-18'; -- Monday

SELECT
    DATEDIFF(day, @Date0, @Date1) - 
    DATEDIFF(week, @Date0, @Date1) * 2 AS BusinessDays;

结果

BusinessDays
6

您的查询将如下所示:

SELECT COUNT(*)
FROM Orders
WHERE
    DATEDIFF(day,  COALESCE(Date1, Date2), Date0) -
    DATEDIFF(week, COALESCE(Date1, Date2), Date0) * 2 <= 1
;

关于SQL 日期差异工作日,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36612414/

相关文章:

mysql - 如何创建MySQL分层递归查询

sql - 如何使用硬编码值而不是子查询定义 'with clause'?

sql-server - 每个表中的列名必须是唯一的

sql-server - SQL Server 中运算符 != 和 <> 有什么区别?

sql-server - 无法在 Linux 的 MSSQL RC1 服务器设置中挂载数据目录

c# - 如何删除另一表中包含其父行的数据的行

mysql - 如何获取每个月最后一分钟的行?

每组行具有唯一递增 ID 的 SQL 查询 (Postgresql)

sql-server - select语句上的sql行锁

mysql - 如何从单个组中获取最后一条记录