Как преобразовать серийный номер даты Excel в дату в Oracle SQL - PullRequest
0 голосов
/ 08 ноября 2018

Я пытался преобразовать тот же формат даты Excel в формат дд / мм / гггг. Но я не получаю правильный результат.

43236   16-May-18
43249   29-May-18
43238   18-May-18
43228   8-May-18
43238   18-May-18

Я использую запрос ниже

SELECT to_date('31-12-1899','dd-mm-yyyy')+43236 FROM dual UNION ALL SELECT to_date('31-12-1899','dd-mm-yyyy')+43249 FROM dual UNION ALL SELECT to_date('31-12-1899','dd-mm-yyyy')+43238 FROM dual UNION ALL SELECT to_date('31-12-1899','dd-mm-yyyy')+43228 FROM dual UNION ALL SELECT to_date('31-12-1899','dd-mm-yyyy')+43238 FROM dual;

Я получаю приведенный ниже результат, который не верен

17-MAY-18
30-MAY-18
19-MAY-18
09-MAY-18
19-MAY-18

Пожалуйста, помогите мне в этом. Я использую Oracle 11g R2.

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Вы можете попробовать ниже, используя функцию to_char ()

select to_char(TO_date('31-12-1899', 'dd-mm-yyyy')+43236,'DD/MM/YYYY')  from dual
0 голосов
/ 08 ноября 2018

Вы просто на 1. Используйте 30 декабря 1899 (вместо 31 декабря 1899 ) в качестве контрольной даты для индекса 0.

SELECT to_date('31-12-1899','dd-mm-yyyy') + 43236 FROM dual

Причина, по которой 30 декабря 1899 года, а не 1 января 1900 года, двойственна:

  1. В Excel 1 января 1900 года сохраняется как 1 (а не как 0, как ожидал бы ИТ-специалист).
  2. Excel рассматривает 1900 год как високосный, хотя его и не было. Поэтому в Excel также есть номер на 29 февраля 1900 года, которого не было.
0 голосов
/ 08 ноября 2018

Если я правильно понимаю, вы можете попытаться использовать TO_DATE и установить языковую культуру, тогда TO_CHAR для ожидаемого формата.

select TO_CHAR(TO_DATE('16-May-18','DD-Mon-YY', 'nls_date_language = american'),'DD/mm/yyyy')
from dual

или как это.

SELECT TO_CHAR(to_date('31-12-1899','dd-mm-yyyy')+43236,'DD/mm/yyyy') FROM dual

sqlfiddle

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