Oracle SQL считает, что это 1909 год, а не 2009 - PullRequest
0 голосов
/ 22 февраля 2020

Это рисунок 10-41 из учебника Кастила 12 c SQL.

В книге приведен пример, который работает на моем местном 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 год для вычисления month_between

Ответы [ 3 ]

3 голосов
/ 22 февраля 2020

Как я могу сказать SQL, что это 2009 год для расчета month_between?

Будьте точны c (не полагайтесь на интерпретацию литералов даты по умолчанию), используйте DATE или TO_DATE() например

DATE '2009-07-01'
TO_DATE('01-JUL-2009','dd-mmm-yyyyy')

DATE требует литерала YYYY-MM-DD. тогда как TO_DATE() позволяет вам указать буквальный шаблон для использования. См. Литералы даты

ps. Лично мне не нравится использовать литералы даты, зависящие от разговорного языка, или 2 di git ссылки на год

0 голосов
/ 22 февраля 2020

С двумя значениями git лет вы можете использовать формат даты RR, поэтому от 00 до 49 берутся за текущий век (а от 50 до 99 - за следующий век), поэтому:

TO_DATE('01-JUL-09', 'DD-MON-RR')

См .: http://docs.oracle.com/database/122/SQLRF/Format-Models.htm#GUID -6C75461E-2E18-4C35-9EB4-038A7E1C9C1F

Кроме того, немного за пределами моей области знаний, но я думаю, что вы можете установить этот формат даты по умолчанию используя NLS_DATE_FORMAT, поэтому выполните поиск по этому термину - например,

https://docs.oracle.com/cd/B19306_01/server.102/b14237/initparams122.htm#REFRN10119

0 голосов
/ 22 февраля 2020

Попробуйте преобразовать строковые даты в фактические с TO_DATE ex. TO_DATE('01-JUL-2009', 'dd-MON-YYYY')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...