Изменение запроса для работы без необходимости установки NLS_DATE_FORMAT - PullRequest
0 голосов
/ 15 января 2019

I следующий запрос:

SELECT
    trunc(estimatedenddate,'hh') AS reg_date,
    COUNT(*)
FROM
    (
        SELECT
            attr_value,
            TO_DATE( (DATE '1970-01-01' + (1 / 24 / 60 / 60 / 1000) * attr_value),'yyyy-mm-dd HH24:mi:ss') AS estimatedenddate
        FROM
            attr
        WHERE
            attr_name = 'createTimestamp'
    )
WHERE
    estimatedenddate > TO_DATE('01/JUN/2018','dd/mon/yyyy')
GROUP BY
    trunc(estimatedenddate,'hh')
ORDER BY
    reg_date DESC;

Это работает, когда я устанавливаю NLS_DATE_FORMAT . См. dbfiddle .

Однако, если я не установлю NLS_DATE_FORMAT , запрос не даст никаких результатов. Смотри dbfiddle

Как я могу изменить этот запрос так, чтобы он работал без установки NLS_DATE_FORMAT ?

1 Ответ

0 голосов
/ 15 января 2019

TO_DATE( date_string, format_model ) принимает строку для первого аргумента, но вы передаете тип данных DATE, который Oracle постарается помочь и неявно преобразует в ожидаемый тип данных строки, используя свою модель формата по умолчанию; так что ваш внутренний запрос эффективен:

SELECT attr_value,
       TO_DATE(
         TO_CHAR(
           DATE '1970-01-01' + (1 / 24 / 60 / 60 / 1000) * attr_value,
           (SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT')
         ),
         'yyyy-mm-dd HH24:mi:ss'
       ) AS estimatedenddate
FROM   attr
WHERE  attr_name = 'createTimestamp'

Вместо этого вы можете просто удалить функцию TO_DATE():

SELECT trunc(estimatedenddate,'hh') AS reg_date,
       COUNT(*)
FROM   (
  SELECT DATE '1970-01-01' + (1 / 24 / 60 / 60 / 1000) * attr_value AS estimatedenddate
  FROM   attr
  WHERE  attr_name = 'createTimestamp'
)
WHERE    estimatedenddate > DATE '2018-06-01'
GROUP BY trunc(estimatedenddate,'hh')
ORDER BY reg_date DESC;
...