前几个月的 SQL 固定日期

Posted

技术标签:

【中文标题】前几个月的 SQL 固定日期【英文标题】:SQL Fixed Date from Previous Months 【发布时间】:2017-11-10 21:52:34 【问题描述】:

我希望每个月生成一份报告,以提取由特定任务打开日期驱动的数据。

关键字段是“progdate”(将包含日期“dd/mm/yyyy”)。

提取可能会在当月的最后一周运行,在本示例中我会说是 25 日(如果那是周末或银行假日,它将在下一个工作日运行天)。

代码运行时,需要带回两个月前一个月 25 日和上个月 24 日的所有 'progdate' 返回。 (这两个日期将是固定的,不会从一个月到下一个月更改,因此将始终涵盖完全相同的时期)。

即。如果我在 10 月 25 日运行它,它将返回 8 月 25 日到 9 月 24 日的数据。如果我在 11 月 25 日运行它,它会返回从 9 月 25 日到 10 月 24 日的数据......等等。

我试过了;

SELECT progdate, progtaskcode, progowner FROM progpoints
WHERE progdate BETWEEN to_char(add_months(sysdate, -2) 
AND to_char(add_months(sysdate, -1)-1)

现在这种工作.. 但如果代码不是在每个月的同一天运行,就会失败。如果是假期或周末,它可能会错过一两天的数据(或导致从一个提取到另一个重复)。

关于如何在不使用 Sysdate 和编码的情况下在两个月前的 25 日到上个月的 24 日完成这项工作的任何想法?

非常感谢! :)

【问题讨论】:

您的问题描述自相矛盾。如果 10 月 25 日恰逢星期六(在某些年份肯定如此),您可能需要在 8 月 27 日至 9 月 26 日期间运行报告。那么 11 月 25 日是工作日,因此报告必须是从 9 月 25 日到 10 月 24 日。因此,您在 9 月 25 日至 26 日有重叠。如果您必须避免这种重叠,那么您必须修改报告期间的“定义”。 如何修改是商业决策,不是编程问题! 感谢 mathguy 的回复。不确定我是否完全理解。如果报告被编码为从两个特定的日期(无论它们是银行假期还是周末)中提取,那么无论报告是在哪一天运行,那么它总是只查找那些日期? (所以我可以在 3 日、10 日、30 日运行它,它仍然只会从指定的两个日期拉回,即 25 日(两个月前)到 24 日(上个月)?如果 24 日或 25 日是周末或节假日,它只是不会返回那些日子的任何数据(因为这两个日期不会显示任何内容) 我同意 mathguy,您的要求不明确。如果 a) SYSDATE 在周末,b) add_months(sysdate, -2) 在周末,3) add_months(sysdate, -1)-1) 在周末,请清楚地描述您的期望。此外,您不应将 DATE progdateSTRING to_char(add_months(... 进行比较 感谢 Wenfried .. 回答您的问题; a) sysdate 不会落在周末,因为报告不会在那些日子运行 - 如果 25 日的截止日期是,那么它将在下一个工作日运行,然后使 sysdate 成为工作日 b & c ) 两者相同,如果其中任何一天是周末,则它不会返回这些日期的数据,因为它们不会保存在数据库中。有没有一种简单的方法来编写从今天到上个月 24 日两个月前的 25 天返回数据的简单方法? 我仍然不清楚您的要求。不要告诉我们你没有看到什么,告诉我们你期望的结果。举例说明SYSDATE 并期望下限 (add_months(sysdate, -2)) 和上限 (add_months(sysdate, -1)-1)),尤其是。几个月的最后一天 - 特别是 2 月 28 日/29 日。 【参考方案1】:

你可以试试这个。

BETWEEN  TRUNC(ADD_MONTHS(SYSDATE ,- 2), 'MONTH') + 24  
AND TRUNC(ADD_MONTHS(SYSDATE ,- 1), 'MONTH') + 23

关于如何在不使用 Sysdate 的情况下完成此操作的任何想法

如果您的表/架构中有一个列,其中包含您运行查询的日历日期或业务日期的信息,这是可能的。

【讨论】:

谢谢考希克。我想我关于不使用 Sysdate 的查询可以用你上面的代码解决(我会在一段时间内尝试),因为这可以追溯到两个月前的第一个月并添加 24(这让我得到了 25 日)然后到上个月的 1 日,加上 23(让我到 24 日),然后给我我的范围 - 使用今天作为 sysdate 起点。因此,从这一点来看,无论报告是在哪一天运行,它总是会转到所需月份范围的 25 日至 24 日。 谢谢考希克。我刚刚在一系列测试日期上尝试过这个(因为我目前无法访问实时环境,因为我不在工作) - 它为我提供了我在数据中寻找的确切日期范围提取。

以上是关于前几个月的 SQL 固定日期的主要内容,如果未能解决你的问题,请参考以下文章

sql 查找从现在开始/之前的几个月的日期

Hive SQL 整数 YYYYMM 前几个月

如何用sql的日期函数,分别查出1月~12月每个月的销售金额?

获取当前时间的前几个月的星期起始结束时间

固定日期范围之间的 MySQL 记录

一个时间插件是如何做到前几个月和后个几月的设置