复杂的日期范围

Posted

技术标签:

【中文标题】复杂的日期范围【英文标题】:Complex Date Range 【发布时间】:2015-10-29 17:40:45 【问题描述】:

我正在处理以下查询,但无法弄清楚它的最后一部分。我需要我的查询为我提供上一个业务和上一个工作日减去 (-) 28 天之间的结果集。 (例如,日期范围在 2015 年 10 月 28 日和 2015 年 10 月 28 日 -28 之间)到目前为止我写的查询只给了我第 -28 天(2015 年 9 月 30 日),而不是之前业务之间的范围日和前一个工作日-28。我的研究表明有几种不同的方法可以做到这一点,但到目前为止没有一种方法对我有用。

SELECT SMBL, SUM(NET_FLOWS/1000000.00) 
FROM HISTORY
WHERE DATE - 28 = DATE AND DATE = TO_DATE('10282015','MMDDYYYY') 
AND SYMBOL IN ('AAA','BBB')
GROUP BY SMBL 

【问题讨论】:

WHERE DATE between TO_DATE('10282015','MMDDYYYY') - 28 and TO_DATE('10282015','MMDDYYYY') 怎么样? BETWEEN 包含在内。 DATE-28=DATE 怎样才能解析为 TRUE? @MarmiteBomber 是的,它起作用了。感谢您的帮助 @MichaelBroughton 这是我公司正在使用的计算。我知道你的意思,但是它是我测试的一部分,我需要以这种特定的方式拥有它。 @MichaelBroughton 有点离题,但是我刚刚发现我的结果集应该显示 Net_flows 中的前 10 个值,而不是我在此查询中查找的特定 SYMBOL。你能帮我解决这个问题吗?提前致谢。 【参考方案1】:

首先,日期范围很容易使用 BETWEEN,因此您可以快速解决:

WHERE DATE BETWEEN (SYSDATE-28) and (SYSDATE-1)

然后你意识到你的日期有时间成分,所以要包括昨天的所有内容和第 28 天的所有内容,你需要:

WHERE DATE >= TRUNC(SYSDATE)-28 
AND   DATE < TRUNC(SYSDATE)

然后我查看您的规则“前一个工作日”并问 - 您的工作日是什么?在周一去上周五?还是周六?或者您是每周 7 天营业的企业?法定节假日怎么过?现在是 28 日历天吗?还是 28 个工作日?

啊,业务规则。魔鬼总是在那些细节中......

【讨论】:

回答您的一些问题。我们是一家周一至周五(5 个工作日)的公司。因此,如果它是星期一,那么我们将恢复到星期五的营业日期以获取数据。我使用 28 天的原因是因为我们使用 4 周的日期范围进行计算,因此这就是 28 天的来源。您对 sysdate-28 的查询有点偏离,因为我的出发点是上一个营业日期而不是当前日期。但是,只需简单地增加一天,例如sysdate - 29,查询工作正常。谢谢。 是的,业务 -1 然后 - 28。我错过了额外的一天。就像我说的......总是那些小细节让你大吃一惊:-)

以上是关于复杂的日期范围的主要内容,如果未能解决你的问题,请参考以下文章

降低这个公式的复杂性?

为啥我无法获取某个日期范围内的记录?

根据日期范围查找至少 2 个连续项目

SQL Server 成员资格日期范围

计算介于预定义日期范围之间的天数

从长的复杂日期加上时间戳中提取日期?