这是在一份报告中使用的,我不明白他们在这里试图做什么。
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)
我想知道他们想在这里呆多久。
3条答案
按热度按时间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这看起来像一个不想要的结果给我呢?
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
加到下个月的第一天,就是下个月的最后一天。因此,范围为下个月的第一天至下个月的最后一天。
4c8rllxm3#
日期函数通常特定于一个RDBMS。这看起来部分像Oracle(
to_date()
),部分像SQL Server(DAY()
),所以这很令人困惑。to_date()
将8位字符串转换为日期DAY()
返回月份的日期n DAY
是一个区间n MONTH
是一个区间这似乎是...
first day of next month
和last day of next month
之间.其中“本月”是给定日期的福尔斯地。
所以为什么不简单地说