【发布时间】:2021-06-29 10:16:33
【问题描述】:
对于一对日期(date1, date2) = (Fri 2021-01-01, Wed 2020-01-01),我需要从 date1(本例中为星期五)中提取星期几,然后为 date2 找到最近的星期五(或其他日期)。
上述对的结果将是 Fri 2020-01-03(该星期三后 2 天)而不是 Fri 2019-12-27(该星期三前 5 天)。
有些示例可以查找上一个/下一个星期,使用硬编码的星期几或使用SET DATEFIRST 语句;所有这些我都必须避免。这是一些测试数据——日期和预期结果:
CREATE TABLE #tests (
date1 DATE,
date2 DATE,
result DATE
);
INSERT INTO #tests(date1, date2, result) VALUES
(/*Fri*/ '2021-01-01', /*Wed*/ '2020-01-01', /*Fri*/ '2020-01-03'),
(/*Sat*/ '2021-01-02', /*Thu*/ '2020-01-02', /*Sat*/ '2020-01-04'),
(/*Sun*/ '2021-01-03', /*Fri*/ '2020-01-03', /*Sun*/ '2020-01-05'),
(/*Mon*/ '2021-01-04', /*Sat*/ '2020-01-04', /*Mon*/ '2020-01-06'),
(/*Tue*/ '2021-01-05', /*Sun*/ '2020-01-05', /*Tue*/ '2020-01-07'),
(/*Wed*/ '2021-01-06', /*Mon*/ '2020-01-06', /*Wed*/ '2020-01-08'),
(/*Thu*/ '2021-01-07', /*Tue*/ '2020-01-07', /*Thu*/ '2020-01-09');
INSERT INTO #tests(date1, date2, result) VALUES
(/*Fri*/ '2021-01-01', /*Sun*/ '2017-01-01', /*Fri*/ '2016-12-30'),
(/*Sat*/ '2021-01-02', /*Mon*/ '2017-01-02', /*Sat*/ '2016-12-31'),
(/*Sun*/ '2021-01-03', /*Tue*/ '2017-01-03', /*Sun*/ '2017-01-01'),
(/*Mon*/ '2021-01-04', /*Wed*/ '2017-01-04', /*Mon*/ '2017-01-02'),
(/*Tue*/ '2021-01-05', /*Thu*/ '2017-01-05', /*Tue*/ '2017-01-03'),
(/*Wed*/ '2021-01-06', /*Fri*/ '2017-01-06', /*Wed*/ '2017-01-04'),
(/*Thu*/ '2021-01-07', /*Sat*/ '2017-01-07', /*Thu*/ '2017-01-05');
【问题讨论】:
-
您是否有权/自行决定创建日历维度表,其中包含从 1900 到 2100 的星期几数据?这将大大简化问题。
-
@Error_2646 我有一个和/或我可以修改它。
-
两个日期输入是否会是一周中的同一天 - 就像星期三一样?如果是这样,它应该返回下一个星期三还是只返回相同的第二个输入日期?
-
@error 同一日期。预计输入中的任何日期