【问题标题】:Select based on the next business day in a calendar table根据日历表中的下一个工作日选择
【发布时间】:2018-10-12 14:43:32
【问题描述】:

我已经填写了一个日历表(Calendar_Date, Is_Business_Day)。

我已经在此基础上做了一个SELECT:

  • 如果今天是在当月的第 3 天之前,则选择该天之前的所有天,直到倒数第二个月的最后一天

例如:今天是2018-05-02,这是我的输出:

Calendar_Date |  Is_Business_Day
  2000-01-01  |    0
  ...         |
  2018-03-29  |    1
  2018-03-30  |    1
  2018-03-31  |    0
  • 如果今天在当月的第 3 天之后,请选择该天之前到上个月最后一天的所有天数。

例如:明天,2018-05-03,这将是我的输出:

Calendar_Date | Is_Business_Day
  2000-01-01  |   0
  ...         |  
  2018-04-28  |   0
  2018-04-29  |   0
  2018-04-30  |   1

这是我的查询:

SELECT        Calendar_Date, Is_Business_Day
FROM            Calendar_Table
WHERE        (Calendar_Date <= (CASE WHEN DATEPART(day, GETDATE()) >= 3 THEN EOMONTH(DATEADD(MONTH, - 1, GETDATE())) ELSE EOMONTH(DATEADD(MONTH, - 2, GETDATE())) END))

这工作得很好,但我现在想做的是在每月第三天之后的第一个工作日之后切换,而不是在每月第三天之后切换.

如何使用日历表中有关工作日的信息来执行此操作?

【问题讨论】:

  • 不将AND Is_Business_Day = 1 添加到WHERE 子句中吗?您的问题不清楚,因为您问的是“切换”,而没有在问题中的任何其他地方解释您所说的“切换”。
  • 当我添加 AND Is_Business_Day = 1 时,我的选择中只有工作日,但我也希望有非工作日。

标签: sql sql-server date calendar where


【解决方案1】:

我认为以下查询应该有效。

   ;WITH CTE AS
    (
        SELECT        Calendar_Date, Is_Business_Day
        FROM          Calendar_Table
        WHERE        (Calendar_Date <= (CASE WHEN DATEPART(day, GETDATE()) >= 3 
                                          THEN EOMONTH(DATEADD(MONTH, - 1, GETDATE())) 
                                  ELSE EOMONTH(DATEADD(MONTH, - 2, GETDATE())) END))
    )
    SELECT * FROM CTE
    WHERE Calendar_Date >= (SELECT MIN(Calendar_Date) FROM CTE WHERE Is_Business_Day=1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多