Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL认为它';是1909年,不是2009年_Sql_Oracle - Fatal编程技术网

Oracle SQL认为它';是1909年,不是2009年

Oracle SQL认为它';是1909年,不是2009年,sql,oracle,Sql,Oracle,这是Castel 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

这是Castel 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;

如何告诉SQL计算之间的月份是2009年?

尝试使用
to\u DATE
将字符串日期转换为实际日期,例如
to\u DATE('01-JUL-2009','dd MON YYYY')
使用RR日期格式,因此00到49是当前世纪(50到99是下一个世纪),因此:

见:

另外,有点超出我的知识范围,但我认为您可以使用NLS_date_格式将此日期格式设置为默认格式,因此对该术语进行搜索-例如

如何告诉SQL在计算之间的几个月是2009年

具体点(不要依赖日期文字的默认解释),使用
date
TO_date()
例如

DATE '2009-07-01'
TO_DATE('01-JUL-2009','dd-mmm-yyyyy')
DATE
需要YYYY-MM-DD文本。而
TO_DATE()
允许您指定要使用的文字模式。看


ps:就我个人而言,我不喜欢使用与口语相关的日期文字,或2位数的年份引用

我非常怀疑您的说法,即Oracle将
'01-JUL-2009'
解释为1909年7月1日。你能拿出一个能证明这种行为的数字吗?@ruakh,教科书上的数字已经列出了。我在SQL开发者虚拟机上。
TO_DATE('01-JUL-09', 'DD-MON-RR')
DATE '2009-07-01'
TO_DATE('01-JUL-2009','dd-mmm-yyyyy')