При преобразовании даты и времени в качестве даты, почему SQLite3 возвращает только год, а не полную дату? - PullRequest
1 голос
/ 09 октября 2019

Я знаю, что вы можете приводить datetime к дате, используя функцию date () :

sqlite> select date('2000-01-01 10:00:00');
2000-01-01

Но почему выражение преобразования SQLite3 , например, в

sqlite> select cast('2000-01-01 10:00:00' as date);
2000

только возвращает год?

Даже при использовании явной установки datetime () возвращается только год:

sqlite> select cast(datetime('2000-01-01 10:00:00') as date);
2000

Или:

sqlite> select cast(datetime('now') as date);
2019

Глядя на Postgresql, он правильно разрешает оба:

postgresql> select date('2000-01-01 10:00:00');
2000-01-01

postgresql> select cast('2000-01-01 10:00:00' as date);
2000-01-01

Каково техническое объяснение поведения SQLite3 - для меня неожиданного - поведение?

1 Ответ

3 голосов
/ 09 октября 2019

Для SQLite тип данных Date отсутствует. Как указано в их документации здесь: https://www.sqlite.org/datatype3.html

То, что вы используете как Date, на самом деле TEXT.

Вы можете проверить, что:

select typeof(datetime('now'));

возвращает:

text

И:

select typeof(cast(datetime('now') as date));

возвращает:

integer

Таким образом, результат cast('2000-01-01 10:00:00' as date) является целым числом, и это то же самое целое число, которое вы получаете:

select '2000-01-01 10:00:00' + 0

, когда SQLite неявно преобразует '2000-01-01 10:00:00' в 2000, чтобы использовать его вматематическая операция. В случае дат это числовое значение года, но в целом SQLite возвращает самую длинную подстроку TEXT, начиная с 1-го символа, которая может быть представлена ​​как целое число. Так что для '2000-01-01 10:00:00' это подстрока до 1-го -, то есть года.

...