Почему функция CAST() возвращает неверную дату?

Я пытаюсь получить часть даты из поля timestamp. Я использовал этот SQL-запрос:

select timestamp, CAST(timestamp as date) as date from messages

Я получил следующий результат:

--------------------------------------------
|        timestamp        |      date      |
--------------------------------------------
|   2016-05-15 10:22:54   |   2016-05-16   |
--------------------------------------------

Как показано выше, созданное поле даты возвращает неверную дату 2016-05-16, тогда как исходная дата 2016-05-15.

Как мы можем решить эту проблему?

Ответ 1

Использовать дату, отличную от того, что она не выполняется, но формат

select timestamp, date(timestamp) as my_date from messages

Ответ 2

Это не проблема!!! Его единственный установлен неверный time_zone. см. образец

получить текущую time_zone

SHOW GLOBAL VARIABLES LIKE 'time_zone'; -- systemwide setting
SHOW VARIABLES LIKE 'time_zone'; -- session setting

Пример

MariaDB [mysql]> select t, CAST(t as date) FROM groupme LIMIT 1;
+---------------------+-----------------+
| t                   | CAST(t as date) |
+---------------------+-----------------+
| 2016-05-15 20:22:54 | 2016-05-15      |
+---------------------+-----------------+
1 row in set (0.00 sec)

MariaDB [mysql]> SET  time_zone ='-12:00';
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]> select t, CAST(t as date) FROM groupme LIMIT 1;
+---------------------+-----------------+
| t                   | CAST(t as date) |
+---------------------+-----------------+
| 2016-05-14 20:22:54 | 2016-05-14      |
+---------------------+-----------------+
1 row in set (0.00 sec)

MariaDB [mysql]>

Ответ 3

Я предлагаю вам использовать функцию DATE_FORMAT, а не CAST, поскольку вы форматируете дату, например

SELECT `timestamp`, DATE_FORMAT(`timestamp`, '%Y-%m-%d) as my_date from messages

Также обратите внимание, что и функция CAST, и DATE внутренне вызывают функцию Item_date_typecast, поэтому между ними нет такой разницы.

Ответ 4

Попробуйте это

select timestamp, cast(timestamp as date format 'yyyymmddhhmmss') as date from messages