sql - Oracle SQL 认为是 1909 年,而不是 2009 年
问题描述
这是来自 Casteel 12c SQL 教科书的图 10-41。
这本书有一个在我本地 SQL 开发人员上运行的示例返回错误的年数,因为它认为查询是针对 1909 年,而不是 2009 年。
select empno, lname, fname,hiredate,
ROUND(MONTHS_BETWEEN(hiredate, '01-JUL-09')/12,2) "Years",
case
when (months_between('01-JUL-09', hiredate)/12) < 4 then 'Level 1'
when (months_between('01-JUL-09', hiredate)/12) < 8 then 'Level 2'
when (months_between('01-JUL-09', hiredate)/12) < 11 then 'Level 3'
when (months_between('01-JUL-09', hiredate)/12) < 15 then 'Level 4'
else 'Level 5'
end "Retire Level"
from employees;
返回范围为 82 到 89 年(到小数点后 2 位),但在教科书中,它显示的返回值范围为 10 到 17 年,因为它正确地计算了 2009 年。
所以我将其更改为2009
但得到相同的结果:
select empno, lname, fname,hiredate,
ROUND(MONTHS_BETWEEN(hiredate, '01-JUL-2009')/12,2) "Years",
case
when (months_between('01-JUL-2009', hiredate)/12) < 4 then 'Level 1'
when (months_between('01-JUL-2009', hiredate)/12) < 8 then 'Level 2'
when (months_between('01-JUL-2009', hiredate)/12) < 11 then 'Level 3'
when (months_between('01-JUL-2009', hiredate)/12) < 15 then 'Level 4'
else 'Level 5'
end "Retire Level"
from employees;
我如何告诉 SQL 是 2009 年的months_between 计算?
解决方案
我如何告诉 SQL 是 2009 年的months_between 计算?
具体(不要依赖日期文字的默认解释),使用DATE
或TO_DATE()
例如
DATE '2009-07-01'
TO_DATE('01-JUL-2009','dd-mmm-yyyyy')
DATE
需要 YYYY-MM-DD 文字。而TO_DATE()
允许您指定要使用的文字模式。请参阅日期文字
ps:我个人不喜欢使用口语相关的日期文字,或 2 位数的年份参考
推荐阅读
- java - 无法再在任何 IDE 上运行 JavaFX
- angular - Angular 应用程序无法在 Docker 中启动,缺少 angular-devkit package.json
- java - 如何测试以查看 java Junit 5 中的抽象方法?
- java - Java SimpleDateFormat 将字符串数组列表转换为日期列表
- python - GeocoderUnavailable:使用 geopy 和 Nominatim 的某些地址的 HTTPSConnectionPool 错误
- c# - 是否可以从同一个应用程序登录到两个不同的 Application Insights 实例?
- r - R中的数据可视化澄清密度/直方图
- go - Librdkafka Go 消费者和 websocket 问题
- gtkmm - 如何在 gtkmm3 中使用单选按钮?
- python - TypeError:nlargest() 得到了一个意外的关键字参数“列”