Как я могу заставить SQLite преобразовывать порядковые номера типа Excel в даты, например, Я хочу, чтобы целое число 40074 в таблице так или иначе получило дату 18 сентября 2009?
Даты уже находятся в SQLite.
sqlite> SELECT DATE('1899-12-30', '+40074 days');
2009-09-18
Кажется, это работает:
sqlite> SELECT DATETIME((49400 * 3600 * 24) - 3014928000, 'unixepoch');
2009-09-18 00:00:00
Честно говоря, я просто угадал и проверил там константу, но я уверен, что есть простая математика, чтобы подкрепить это.
Похоже, что это работает и для дат, более ранних, чем эпоха, но я не проверял это тщательно.
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 был високосным)