首页 > 解决方案 > 具有固定日期和月份但相对年份的 SQL 日期

问题描述

我在 BusinessObjects WEBI 中创建了一个报告,但我想自定义基础 SQL,以便日期范围中的年份根据查询运行时间而变化,而日期和月份保持不变

这个例子...

WHERE
ACT_ENDDT  BETWEEN  '01-10-2019 00:00:00'  AND  '30-09-2020 00:00:00'

...如果我现在运行查询(分别是当年 -1 和当年)是可取的,但如果我要在 2021 年运行此查询,我希望这些年份分别更改为 2020 年和 2021 年,保持日期和月份相同(10/1 和 9/30)。

我搜索了一些资源,如 sqltutorial 和 w3schools,但我在这方面几乎不是新手,无法理解如何使其工作。我还尝试了线程 28707795 中提供的解决方案,如下所示:

ACT_ENDDT  BETWEEN  DATEFROMPARTS(YEAR(getdate())-1,10,1) AND DATEFROMPARTS(YEAR(getdate()),9,30)

...但最终会收到一条消息,指出 DATEFROMPARTS 是无效的标识符。

有没有办法对日期的一部分进行硬编码并在一年中附加一个修饰符,例如... BETWEEN '01-10-'&[*currentyear* - 1] ...

谢谢。

标签: sqloracledatetimebusiness-objectsdate-arithmetic

解决方案


您可以像这样使用日期算法:

where act_enddt between trunc(sysdate, 'year') - interval '3' month
                    and trunc(sysdate, 'year') + interval '9' month - interval '1' day

我想知道半开区间是否也有帮助:

where act_enddt >= trunc(sysdate, 'year') - interval '3' month
  and act_enddt <  trunc(sysdate, 'year') + interval '9' month

这两个表达式之间的区别在于后者允许日期介于 10 月 30 日 00:00 和当天结束之间。如果您的日期没有时间组件,这不会产生影响(第二个表达式更简洁一些)。


推荐阅读