[英]SQL query to find dates of last year equivalent to today's date
我正在編寫 SQL 查詢以查找與今天日期相同的去年的業務工作日期。
在此查詢中,它應該獲取:-
例如,如果今天是 2021 年 1 月 5 日,並且是一年中第二周的第二天。 所以我需要找到上一年第二周第二天的確切日期。 所以應該是 2020 年 1 月 7 日。
有了這個,我需要 2020 年 1 月 7 日(即不包括周六和周日)那一周的業務工作日期,根據示例,這將是 2020 年 1 月 6 日至 2020 年 1 月 10 日。
所以我需要 2020 年 1 月 6 日至 10 日之間的報告。
我正在嘗試使用此代碼查找與今天日期相同的去年日期(2021 年 1 月 5 日,即第二周的第二天)
select Convert(date, (DATEADD(year, -1, getdate()+2)));
根據 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 標准的正確值。
我已經使用多個CTE
向您展示逐步計算。 應該很容易理解。
基本上它會找到2021-01-05
的week_no
和day_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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.