Не удается преобразовать число в дату

У меня проблема с преобразованием числового столбца в дату, я сделал следующее

SELECT to_date('12-30-1899 1:00:00','MM-DD-YYYY HH24:Mi:SS') + (createDate/1440) 
FROM table_A;

и получил результат запроса

10/17/5826 17:18

Месяц и дата, включая часы и секунды, правильные, но год другой, я получил 5826. То же самое и для других строк, я получил разные результаты за год. Я следовал некоторым примерам в этом здесь. Но все равно получил неправильный результат. Может ли кто-нибудь помочь в этом спасибо.

Примеры ниже представляют собой значения столбца createDate:

1300844909778
1302831103113
1303210978316
1396963615616

person dimas    schedule 14.04.2014    source источник
comment
Возможно, createDate — это число миллисекунд, прошедших с эпохи Unix, но вы предполагаете, что это быть чем-то другим.   -  person Noel    schedule 14.04.2014
comment
Откуда вы знаете, что все, кроме года, верно — вы уже точно знаете, что должны представлять эти значения?   -  person Alex Poole    schedule 14.04.2014
comment
привет, Алекс, извини за это заявление, я хотел сказать, что месяцы, дни и т. д. отображаются правильно, но значение, которое они представляют, неверно.   -  person dimas    schedule 14.04.2014
comment
@dimas Знаете ли вы, каков ожидаемый результат для каждого значения createDate?   -  person Joseph B    schedule 14.04.2014
comment
привет Джозеф, да это формат даты. Судя по ответам APC и Eat a Peach, они могут быть правы в том, что 13 цифр - это миллисекунды с эпохи Unix. Мне просто нужно доказать, что их теория верна.   -  person dimas    schedule 15.04.2014


Ответы (2)


Арифметика дат в Oracle предполагает дни. В нынешнем виде вы делите очень большое число на 1440 и прибавляете это количество дней к дате начала. Вот почему вы получаете результаты в далеком будущем.

Итак, какое значение представляет createdate? Это явно не реальная дата. Ваш выбор 1440 в качестве знаменателя предполагает, что вы думаете, что это должно быть «количество минут», но если даты настолько далеки от ожидаемых, это тоже не так.


Я подумал, что это могут быть значения, представленные в эпоху Unix, потому что числа начинаются с 13. Разве что они слишком большие. Текущие временные метки Unix должны состоять из десяти цифр. У вас есть тринадцать цифр.

Могут ли они быть эпохой Unix плюс миллисекунды?

Я создал SQLfiddle, чтобы проверить эту теорию. Обработка первых десяти цифр ваших значений createdate как секунд и добавление этого числа к дате Unix дает разумные даты. Проверьте.

Так что теория выдерживает критику. Но я не помогу с вашим запросом. Складывать две даты вместе не имеет никакого смысла. Чего вы на самом деле пытаетесь достичь? Если вы ищете интервал, вам нужно вычесть более раннюю дату из более поздней.

person APC    schedule 14.04.2014
comment
привет APC за все усилия, это не четко задокументировано с нашей стороны, и я все еще новичок в системе. Но, основываясь на коде, он просто использует функцию Date и анализирует даты в этом формате, который мы видим - person dimas; 14.04.2014

createDate может быть количеством миллисекунд. Это всего лишь предположение. Если это так, то, возможно, это поможет:

SELECT to_date('12-30-1899 1:00:00','MM-DD-YYYY HH24:Mi:SS') + (1300844909778/(1000*60*60*24))
FROM dual
/

3/21/1941 2:48:30 AM
person Art    schedule 15.04.2014