【问题标题】:How can I set last business date in SQL Server如何在 SQL Server 中设置最后营业日期
【发布时间】:2021-06-28 15:28:13
【问题描述】:

我是 SQL 的新手。我需要在查询中声明最后营业日期。例如,

  • 如果当天是周一,则返回上周五。
  • 如果当前日期是周二到周五,则返回昨天。

必须排除周末和国定假日。

我需要这种格式:

declare @LastBizDate as datetime
set @LastBizDate = (DATEADD(DAY, CASE DATENAME(WEEKDAY, GETDATE()) 
                      WHEN 'Saturday' THEN -1 
                      WHEN 'Sunday' THEN -2 
                      ELSE -1 END, DATEDIFF(DAY, 0, GETDATE())))

非常感谢您的帮助!

【问题讨论】:

  • 如果您需要考虑公共假期,请购买日历表; SQL Server 不知道您遵守哪些公共假期。
  • 如果您对日期感兴趣,为什么要使用日期时间数据类型?
  • 您好,谢谢,我知道问题出在我的代码中。我应该使用 'Sunday' 和 'Monday' 而不是 'Saturday' 和 'Sunday'。 Larnu 的链接很有帮助!
  • 这还不算假期。

标签: sql sql-server database


【解决方案1】:
declare @LastBizDate as datetime
set @LastBizDate = CASE DATENAME(WEEKDAY, GETDATE())
                      WHEN 'Monday' THEN GETDATE()-3
                      WHEN 'Sunday' THEN GETDATE()-2
                      ELSE GETDATE()-1 END
PRINT @LastBizDate

【讨论】:

  • 我刚刚注意到了。我应该使用 'Sunday' 和 'Monday' 而不是 'Saturday' 和 'Sunday'。非常感谢!
【解决方案2】:

假设NationalHolidayIndicatorNationalHoliday 已经在您的日期表中,请使用相关子查询。

SELECT d.[Date]
, d.NationalHolidayIndicator
--, d.NationalHoliday
, (SELECT MAX([Date])
   FROM [Date] 
   WHERE [Date] < d.[Date]
     AND DATENAME(WEEKDAY, d.[Date]) NOT IN ('Saturday', 'Sunday')
     AND d.NationalHolidayIndicator = 'no'
     --AND d.NationalHoliday IS NULL
  ) as PreviousBusinessDay


FROM [Date] d

如果您还没有 NationalHolidayIndicatorNationalHoliday,对于美国,可能看起来像这样:

case 
  when datepart(month, dt) = 1 and datepart(day, dt) = 1 and datepart(weekday, dt) between 2 and 6 then 'yes'
  when datepart(month, dt) = 1 and datepart(day, dt) = 2 and datepart(weekday, dt) = 2 then 'yes'
  when datepart(month, dt) = 12 and datepart(day, dt) = 31 and datepart(weekday, dt) = 6 then 'yes'
  when datepart(month, dt) = 1 and datepart(day, dt) between 15 and 21 and datepart(weekday, dt) = 2 and datepart(year, dt) > 1985 then 'yes'
  when datepart(month, dt) = 2 and datepart(day, dt) between 15 and 21 and datepart(weekday, dt) = 2 then 'yes'
  when datepart(month, dt) = 5 and datepart(day, dt) > 24 and datepart(weekday, dt) = 2 then 'yes'
  when datepart(month, dt) = 7 and datepart(day, dt) = 4 and datepart(weekday, dt) between 2 and 6 then 'yes'
  when datepart(month, dt) = 7 and datepart(day, dt) = 5 and datepart(weekday, dt) = 2 then 'yes'
  when datepart(month, dt) = 7 and datepart(day, dt) = 3 and datepart(weekday, dt) = 6 then 'yes'
  when datepart(month, dt) = 9 and datepart(day, dt) between 1 and 7 and datepart(weekday, dt) = 2 then 'yes'
  when datepart(month, dt) = 10 and datepart(day, dt) between 8 and 14 and datepart(weekday, dt) = 2 then 'yes'
  when datepart(month, dt) = 11 and datepart(day, dt) = 11 and datepart(weekday, dt) between 2 and 6 then 'yes'
  when datepart(month, dt) = 11 and datepart(day, dt) = 12 and datepart(weekday, dt) = 2 then 'yes'
  when datepart(month, dt) = 11 and datepart(day, dt) = 10 and datepart(weekday, dt) = 6 then 'yes'
  when datepart(month, dt) = 11 and datepart(day, dt) between 22 and 28 and datepart(weekday, dt) = 5 then 'yes'
  when datepart(month, dt) = 12 and datepart(day, dt) = 25 and datepart(weekday, dt) between 2 and 6 then 'yes'
  when datepart(month, dt) = 12 and datepart(day, dt) = 26 and datepart(weekday, dt) = 2 then 'yes'
  when datepart(month, dt) = 12 and datepart(day, dt) = 24 and datepart(weekday, dt) = 6 then 'yes'
  else 'no'
end as NationalHolidayIndicator
, case
  when datepart(month, dt) = 1 and datepart(day, dt) = 1 then 'New Year''s Day'
  when datepart(month, dt) = 1 and datepart(day, dt) = 2 and datepart(weekday, dt) = 2 then 'New Year''s Day - legal'
  when datepart(month, dt) = 12 and datepart(day, dt) = 31 and datepart(weekday, dt) = 6 then 'New Year''s Day - legal'
  when datepart(month, dt) = 1 and datepart(day, dt) between 15 and 21 and datepart(weekday, dt) = 2 and datepart(year, dt) > 1985 then 'Martin Luther King Day'
  when datepart(month, dt) = 2 and datepart(day, dt) between 15 and 21 and datepart(weekday, dt) = 2 then 'Presidents'' Day'
  when datepart(month, dt) = 5 and datepart(day, dt) > 24 and datepart(weekday, dt) = 2 then 'Memorial Day'
  when datepart(month, dt) = 7 and datepart(day, dt) = 4 then 'Independence Day'
  when datepart(month, dt) = 7 and datepart(day, dt) = 5 and datepart(weekday, dt) = 2 then 'Independence Day - legal'
  when datepart(month, dt) = 7 and datepart(day, dt) = 3 and datepart(weekday, dt) = 6 then 'Independence Day - legal'
  when datepart(month, dt) = 9 and datepart(day, dt) between 1 and 7 and datepart(weekday, dt) = 2 then 'Labor Day'
  when datepart(month, dt) = 10 and datepart(day, dt) between 8 and 14 and datepart(weekday, dt) = 2 then 'Columbus Day'
  when datepart(month, dt) = 11 and datepart(day, dt) = 11 then 'Veterans Day'
  when datepart(month, dt) = 11 and datepart(day, dt) = 12 and datepart(weekday, dt) = 2 then 'Veterans Day - legal'
  when datepart(month, dt) = 11 and datepart(day, dt) = 10 and datepart(weekday, dt) = 6 then 'Veterans Day - legal'
  when datepart(month, dt) = 11 and datepart(day, dt) between 22 and 28 and datepart(weekday, dt) = 5 then 'Thanksgiving Day'
  when datepart(month, dt) = 11 and datepart(day, dateadd(day, -1, dt)) between 22 and 28 and datepart(weekday, dateadd(day, -1, dt)) = 5 and datepart(year, dt) between 1977 and 2013 then 'Thanksgiving, Day After'
  when datepart(month, dt) = 11 and datepart(day, dateadd(day, -1, dt)) between 22 and 28 and datepart(weekday, dateadd(day, -1, dt)) = 5 and datepart(year, dt) > 2014 then 'Native American Heritage Day'
  when datepart(month, dt) = 12 and datepart(day, dt) = 25 then 'Christmas Day'
  when datepart(month, dt) = 12 and datepart(day, dt) = 26 and datepart(weekday, dt) = 2 then 'Christmas Day - legal'
  when datepart(month, dt) = 12 and datepart(day, dt) = 24 and datepart(weekday, dt) = 6 then 'Christmas Day - legal'
end as NationalHoliday

...虽然我的假期名称和日期来自我的州法律,而不是联邦法律。

【讨论】:

    猜你喜欢
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多