Oracle - LAST_DAY 和 TRUNC - 执行顺序
Posted
技术标签:
【中文标题】Oracle - LAST_DAY 和 TRUNC - 执行顺序【英文标题】:Oracle - LAST_DAY and TRUNC - order of execution 【发布时间】:2021-10-02 06:56:24 【问题描述】:使用LAST_DAY
和TRUNC
的组合时,我得到了意想不到的结果:
select LAST_DAY(TRUNC(sysdate, 'DAY')) from dual;
--31-JUL-2021 00:00:00
select TRUNC(LAST_DAY(sysdate), 'DAY')from dual;
--26-JUL-2021 00:00:00
为什么这些调用不会返回相同的结果?我的意思是,有什么区别:
-
我希望今天被截断(摆脱小时数)
然后获取该月的最后一天
和
-
我想要一个月的最后一天(带小时)
然后去掉小时部分
【问题讨论】:
只是为了备份已经给出的答案; documentation shows the behaviour 用于不同的格式元素。它还指出“DAY”是 NLS 敏感的。 【参考方案1】:TRUNC(datestamp, 'DAY')
获取包含datestamp
的一周的第一天。奇怪但真实。
如果您想要日期戳的日期,只需使用TRUNC(datestamp)
。
Oracle 日期戳实际上是浮点数。
【讨论】:
哦,天哪,您对“DAY”部分的看法是绝对正确的:D“DD”是我一直在寻找的……完全错过了。谢谢! @O.琼斯。轻微修正。 Oracle 日期(时间戳)不是浮点数,而是整数的内部字节数组(日期为 7 个字节,时间戳为 11-13 个字节)。 See。您可以瞥见这个正在运行的select sysdate, dump(sysdate) from dual;
日期 算术 与浮点算术一起使用是正确的,因为 1 表示一天,因此半天是 0.5 和四分之一一天为 0.25 等。以上是关于Oracle - LAST_DAY 和 TRUNC - 执行顺序的主要内容,如果未能解决你的问题,请参考以下文章
oracle 日期常用函数 (ADD_MONTHS,LAST_DAY,NEXT_DAY,MONTHS_BETWEEN,NEW_TIME,ROUND,TRUNC)
oracle获取本月第一天和最后一天及Oracle trunc()函数的用法
sql 使用date_trunc(),add_months(),last_day()查找previuos /下个月的第一天和最后一天