【问题标题】:Simplest way to fill working day table填写工作日表的最简单方法
【发布时间】:2016-06-14 01:14:51
【问题描述】:

我有一张表 working_days,其中有一列 date 类型为日期

我需要填写在美国的工作日。

你能建议我怎么做吗?

手动太长了。

【问题讨论】:

  • 请用您的数据库标记您的问题。什么是工作日?周末?节假日?
  • 有一个包含所有日期的日历表。 (您将每天标记为工作日、国定假日等)
  • @sgeddes 标记为 ms sql。工作日不是周末也不是假期
  • @jarlh 我在哪里可以找到这些信息?
  • 您需要拥有多少年?不同企业的假期也不同,所以你必须有一些逻辑。度过周末很简单。

标签: sql sql-server date


【解决方案1】:

您可以使用递归 CTE 来完成此操作。这仅不包括周末。使用DATEFIRST,您可以确定周末是哪一天。无论一周中的哪一天设置为DATEFIRST,此查询都应该有效。

;WITH DatesCTE
 AS (

   SELECT CAST('2016-01-01' AS DATE) AS [workingDays]
   UNION ALL

   SELECT DATEADD(DAY, 1, workingdays)
   FROM DatesCTE
   WHERE DATEADD(DAY, 1, workingdays) < '2017-01-01'

)

SELECT *
FROM DatesCTE
WHERE ((DATEPART(dw, workingDays) + @@DATEFIRST) % 7) NOT IN (0, 1)
OPTION (MAXRECURSION 366)

【讨论】:

    【解决方案2】:

    首先在表格中填写年份的所有日期(例如 2016 年):

    DECLARE @date_start date = '2016-01-01',
            @date_end date = '2016-12-31';
    
    WITH cte as (
    SELECT @date_start as [d], 0 as Level
    UNION ALL
    SELECT DATEADD(day,1,[d]), [level] + 1 as [level]
    from cte
    WHERE [level] < DATEDIFF(day,@date_start,@date_end)
    ),
    
    holidays as ( --table with holidays
    SELECT * FROM (VALUES
    ('2016-01-01'),
    ('2016-01-18'),
    ('2016-02-15'),
    ('2016-05-30'),
    ('2016-07-04'),
    ('2016-09-05'),
    ('2016-10-10'),
    ('2016-11-11'),
    ('2016-11-24'),
    ('2016-12-26')) as t(d)
    )
    
    SELECT c.d
    FROM cte c
    LEFT JOIN holidays h on c.d=h.d
        WHERE DATEPART(WEEKDAY,d) NOT IN (1,7)  --will show only monday-friday
    AND AND h.d is NULL
        OPTION (MAXRECURSION 1000); --if you need more than 3 years get MAXRECURSION up
    

    【讨论】:

    • 或者直接加and d not in ('20160704', '20161225', ...)
    • 这个查询在我自己的假期/工作日表中派上用场。
    【解决方案3】:

    一个简单的循环就可以了:

    declare @d date = '20160101';
    while @d <= '20161231'
    begin
        if datepart(weekday, @d) not in (1, 7) and <@d not a holiday>
            insert into working_days ("date") values (@d);
        set @d = dateadd(day, 1, @d);
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      相关资源
      最近更新 更多