如何使用sql在db2中获得去年同一周的开始和结束?

ddrv8njm  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(379)

我有一份使用这些日期参数的周报:

SELECT  *
FROM    TABLE
WHERE   DATE_FIELD BETWEEN (CURRENT DATE - 8 DAYS) AND (CURRENT DATE - 2 DAYS)

它在周一运行以收集前一周的数据(sun-sat)。我现在要做的是在上一年的同一周运行这个。
例如,如果上面的代码在20年6月29日星期一运行,它将返回20年6月21日星期一到20年6月27日星期六的数据,即2020年的第26周。我希望它能返回19年6月23日至19年6月29日(即2019年第26周)的数据。
报告会自动运行,所以我不能每次都插入确切的日期。我也不能仅仅将日期参数抵消到-357和-367天,因为这会被闰年所抵消。
我一直在寻找解决方案,但它们似乎都依赖于dateadd函数,我的db2数据库无法识别该函数。
有人知道我要怎样才能得到我想要的结果吗?任何建议都将不胜感激!:)

cnjp1d6j

cnjp1d6j1#

最简单的方法是建立一个日历或日期表…(谷歌) sql calendar table )
你会发现
日期


一刻钟
星期一
开始每周
周末
周\n
加载表时可以使用week()或week\ iso()函数,注意差异并选择最适合自己的。
这样的日历表使比较当前期间和以前期间变得容易。

g9icjywg

g9icjywg2#

如果假设所有年份都有52周,则可以使用日期算术:

SELECT  *
FROM    TABLE
WHERE   DATE_FIELD BETWEEN (CURRENT DATE - (8 + 364) DAYS) AND (CURRENT DATE - (2 + 364)  DAYS)

因为你希望一周从星期一开始,所以不必考虑闰年。它正好减去52周——闰年对周没有影响。
如果你要面对52或53周的年头,这会变得更复杂。

qcuzuvrc

qcuzuvrc3#

有点复杂,但应该有用。你可以按原样运行或者测试你自己的日期。

SELECT 
  YEAR_1ST_WEEK_END + WEEKS_TO_ADD * 7 - 6 AS WEEK_START
, YEAR_1ST_WEEK_END + WEEKS_TO_ADD * 7     AS WEEK_END
FROM
(
SELECT
  DATE((YEAR(D) - 1)||'-01-01')
+ (7 - DAYOFWEEK(DATE((YEAR(D) - 1)||'-01-01'))) AS YEAR_1ST_WEEK_END
, WEEK(D) - 2 AS WEEKS_TO_ADD
FROM (VALUES DATE('2020-06-29')) T(D)
);

中间柱 YEAR_1ST_WEEK_END 值是给定日期上一年的第一个星期六(周末)。 WEEKS_TO_ADD 是要添加到 YEAR_1ST_WEEK_END 日期。

相关问题