【问题标题】:SQL query to find dates of last year equivalent to today's dateSQL查询查找与今天日期相同的去年日期
【发布时间】:2021-04-11 03:26:26
【问题描述】:

我正在编写一个 SQL 查询来查找与今天日期相同的去年业务工作日期。

在这个查询中它应该获取:-

例如如果今天是 2021 年 1 月 5 日,并且是一年中第二周的第二天。所以我需要找到上一年第二周第二天的确切日期。所以应该是 2020 年 1 月 7 日。

有了这个,我需要 2020 年 1 月 7 日那一周的业务工作日期(即不包括周六和周日) 根据示例,这将是 2020-Jan-06 到 2020-Jan-10。

所以我需要 2020 年 1 月 6 日至 1 月 10 日之间的报告。

我正在尝试使用此代码查找与今天日期相同的去年日期(2021 年 1 月 5 日,即第二周的第二天)

select Convert(date, (DATEADD(year, -1, getdate()+2))) ;

【问题讨论】:

  • 请解释一下 2021-01-05 是“一年中第二周的第二天”。
  • 嗨@GordonLinoff,根据业务场景,一周将从星期一开始,因此 2021 年 1 月 5 日将是一年中第二周的第二天。
  • 您之前的问题有关于日历的建议 - 使用其中之一。您只需添加您需要知道 2021 年 1 月 7 日与 2020 年 1 月 5 日相关的任何列

标签: sql sql-server


【解决方案1】:

根据 ISO 标准,2021-01-05 是 2021 年第一周的第二天。

如果您想要 2021 年第一周的第二天,则可以是今天的日期减去 52 周或 53 周。基于 ISO 日期的 Wikipedia 页面:

[53 周年份] 1 月 1 日或 12 月 31 日为星期四的年份

所以,我们希望在 上一年。因此,我认为以下应该有效:

select dateadd(week,
               (case when 'Thursday' in (datename(weekday, datefromparts(year(getdate()) - 1, 1, 1)),
                                         datename(weekday, datefromparts(year(getdate()) - 1, 12, 31))
                                       )
                    then -53 else -52
               end),
               convert(date, getdate()) 
              )

请注意,这将返回 2019-12-31,这是基于 ISO 标准的正确值。

【讨论】:

  • 嗨@Gordon 非常感谢分享代码。但是,根据要求,我目前还不能使用 ISO 标准。因此,21 年 1 月 5 日将是第二周的第二天,因此相当于 2020 年 1 月 7 日。
  • 为什么要计算两次,你可以用datepart(weekday, datefromparts(year(getdate()) - 1, 1, 1)) IN ('Thursday',Friday) 覆盖这两种情况?
  • @Charlieface 。 . .我认为这不能正确处理闰年。
【解决方案2】:

我已经使用多个CTE 向您展示逐步计算。应该很容易理解。

基本上它会为2021-01-05 找到week_noday_no_of_week,然后使用它为2020 找到相同的日期

declare @input_date     date = '2021-01-05',
        @year_offset    int  = -1;  -- previous year

with 
cte1 as
(
    select  input_date          = @input_date,
            week_no             = DATEPART(WEEK, @input_date),
            first_day_of_week   = DATEADD(WEEK, DATEDIFF(WEEK, 0, @input_date), 0)
),
cte2 as
(
    select  *,
            day_no_of_week = DATEDIFF(DAY, first_day_of_week, @input_date) + 1
    from    cte1 
),
cte3 as
(
    select  *,
            first_day_of_the_prev_year = DATEADD(YEAR, DATEDIFF(YEAR, 0, @input_date) + @year_offset, 0)
    from    cte2
),
cte4 as
(
    select  *,
            first_day_of_week_prev_year = DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(WEEK, week_no - 1, first_day_of_the_prev_year)), 0)
    from    cte3
)
select  *,
        DATEADD(DAY, day_no_of_week - 1, first_day_of_week_prev_year) as the_required_date
from    cte4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    相关资源
    最近更新 更多