Серийные номера даты Excel / SQLite - PullRequest
1 голос
/ 05 мая 2010

Как мне заставить SQLite преобразовывать серийные номера типа Excel в даты, например, Я хочу, чтобы целое число 40074 в таблице каким-то образом получило дату 18 сентября 2009 года?

Даты уже в SQLite.

Ответы [ 3 ]

2 голосов
/ 05 мая 2010

Это похоже на работу:

sqlite> SELECT DATETIME((49400 * 3600 * 24) - 3014928000, 'unixepoch');
2009-09-18 00:00:00

Честно говоря, я просто угадал и проверил константу там, но я уверен, что есть простая математика, чтобы поддержать это.

Похоже, что это работает и для дат раньше, чем эпоха, но я не проверил это полностью.

1 голос
/ 05 мая 2010
sqlite> SELECT DATE('1899-12-30', '+40074 days');
2009-09-18
0 голосов
/ 05 мая 2010

Excel хранит даты как количество дней с 30 декабря 1899 года, поэтому для преобразования числа в дату и обратно нужно просто рассчитать количество дней между 30 декабря 1899 года и датой после , То, как вы это сделаете, зависит от того, на каком именно языке вы работаете, но для C #, например, будет работать следующее:

var epoch = new DateTime(1899, 12, 30);

int number = 40074;
var date = epoch.AddDays(number);
Console.WriteLine(date);

var date = new DateTime(1987, 5, 3);
int number = (int) date.Subtract(epoch).TotalDays;
Console.WriteLine(number);

(Если вам интересно, почему эпоха 30/12/1899, это потому, что фактическая эпоха должна быть 01.01.1900, но Excel ошибочно полагает, что 1900 год был високосным)

...