oracle 日期过滤器逻辑

xhv8bpkk  于 2023-10-16  发布在  Oracle
关注(0)|答案(3)|浏览(103)

这是在一份报告中使用的,我不明白他们在这里试图做什么。

BETWEEN (((to_date(20230822, 'yyyymmdd') - DAY (to_date(20230822, 'yyyymmdd')) DAY + 1 DAY)) +(1) MONTH) 
    AND ((((to_date(20230822, 'yyyymmdd') - DAY (to_date(20230822, 'yyyymmdd')) DAY + 1 DAY) + 1 MONTH- 1 DAY)) +(1) MONTH)

我想知道他们想在这里呆多久。

ih99xse1

ih99xse11#

不知道dbms是很难的--是Informix吗?DAY通常返回给定日期的月份,所以我的猜测是:
之间
2023-08-22 - 22天+ 1天+ 1个月= 2023-09-01

2023-08-22 - 22天+ 1天+ 1个月- 1天+ 1个月= 2023-09-30(我假设!)
它试图做的事情似乎基本上是在下个月的开始和下个月的结束之间。但是我不明白为什么你不只是在参数之间测试这两个参数,并检查它们在DBMS中的计算结果。
但说实话-不知道会是什么结果,如果你饲料2023-02-22例如-有人会需要阅读你的dbms手册会发生什么,如果1个月被添加到2023-02-28 -我可以想象这将是2023-03-28这看起来像一个不想要的结果给我呢?

ou6hu8tu

ou6hu8tu2#

我认为你是基于to_date的使用而使用Oracle的,但无论是SQL Server还是Oracle,以下都适用:
DAY (to_date(20230822, 'yyyymmdd'))返回一个整数,表示Date的日期。
将整数添加到Date会添加到Date的Day部分(为了更清楚,您应该考虑使用DateAdd)。
因此,(to_date(20230822, 'yyyymmdd') - DAY (to_date(20230822, 'yyyymmdd')是一个月的第一天。再加一个月,就是下个月的第一天。
1 month - 1 day加到下个月的第一天,就是下个月的最后一天。
因此,范围为下个月的第一天下个月的最后一天

4c8rllxm

4c8rllxm3#

日期函数通常特定于一个RDBMS。这看起来部分像Oracle(to_date()),部分像SQL Server(DAY()),所以这很令人困惑。
to_date()将8位字符串转换为日期
DAY()返回月份的日期
n DAY是一个区间
n MONTH是一个区间
这似乎是...
first day of next monthlast day of next month之间
.其中“本月”是给定日期的福尔斯地。
所以为什么不简单地说

where month(mydateval) = month(to_date(20230822, 'yyyymmdd') + 1 month)

相关问题