MySQL конвертирует секунды в дату и время

Итак, у меня есть целое число «63605914755», например:

SELECT TO_SECONDS( '2015-08-04 13:40:56' )
-----
Result: '63605914755'

Как преобразовать «63605914755» обратно из секунд в дату и время (например: «2015-08-04 13:40:56»)?


person Maxime    schedule 04.08.2015    source источник
comment
дублируется stackoverflow.com/questions/5385349/ - пожалуйста, прочитайте это.   -  person Neil    schedule 04.08.2015
comment
Я читал, но это не решило мою проблему. Вот почему я сделал это. И UNIX_TIMESTAMP(63605914755), и FROM_UNIXTIME(63605914755) возвращают NULL.   -  person Maxime    schedule 04.08.2015
comment
dev.mysql.com/ doc/refman/5.5/en/ Я бы предложил использовать это - тогда, надеюсь, это сработает.   -  person Neil    schedule 04.08.2015
comment
dev.mysql.com/doc/ refman/5.5/ru/   -  person Ivijan Stefan Stipić    schedule 04.08.2015


Ответы (2)


SELECT
  from_unixtime(seconds - to_seconds('1970-01-01 00:00:00')) as my_date_time
FROM 
  your_table

Вот SQLFiddle.

person Mihai Matei    schedule 04.08.2015
comment
«63605914755» — ​​это секунды, это НЕ UNIX TIMESTAMP. Ваше решение вернуло NULL. - person Maxime; 04.08.2015
comment
Будьте осторожны, если ваш сервер MySQL имеет смещение часового пояса, это приведет к тому, что результаты FROM_UNIXTIME будут отключены. часовой пояс, используемый MySQL по умолчанию, равен SYSTEM. , но можно изменить. - person Will B.; 04.06.2019

Другой подход состоит в том, чтобы просто добавить количество секунд назад к базовой дате 0000-01-00. Однако использование 0000-01-00 приведет к NULL, поэтому мы должны указать первый день месяца 0000-01-01.
Это приводит к смещению даты на 1 день. Чтобы учесть это, мы просто вычитаем 1 день из полученной даты:

Пример: http://sqlfiddle.com/#!9/58dad/199

SELECT '0000-01-01' + INTERVAL TO_SECONDS('2015-08-04 13:40:56') SECOND - INTERVAL 1 DAY;

Результаты:

2015-08-04 13:40:56

Чтобы создать функцию FROM_SECONDS, используйте:

DELIMITER //
CREATE FUNCTION `FROM_SECONDS`(
    `secs` BIGINT
)
RETURNS DATETIME
DETERMINISTIC
NO SQL
SQL SECURITY INVOKER
BEGIN
    RETURN '0000-01-01' + INTERVAL secs SECOND - INTERVAL 1 DAY;
END//
SELECT FROM_SECONDS(TO_SECONDS('2015-08-04 13:40:46'));

Поскольку значения DATETIME представляют собой точки во времени (статические), приведенный выше запрос может быть DETERMINISTIC, поскольку результирующие значения предоставленных секунд всегда будут одинаковыми.


Примечание.
Поскольку дата эпохи Unix основана на UTC, когда ваш сервер MySQL использует часовой пояс со смещением, используя FROM_UNIXTIME(seconds - seconds_from_epoch), результирующая дата и время будет отличаться от этого смещения. MySQL использует часовой пояс по умолчанию: SYSTEM часовой пояс.
Для EST использование FROM_UNIXTIME приведет к 2015-08-04 09:40:56.

Чтобы учесть эту проблему, вам нужно рассчитать разницу в минутах между UTC_TIMESTAMP и CURRENT_TIME и вычесть полученное минутное смещение из FROM_UNIXTIME. Это не будет иметь никакого эффекта, если ваш сервер использует UTC, так как результирующее смещение будет равно 0.

SELECT FROM_UNIXTIME(TO_SECONDS('2015-08-04 13:40:56') - TO_SECONDS('1970-01-01 00:00:00')) - INTERVAL TIMESTAMPDIFF(MINUTE, UTC_TIMESTAMP(), NOW()) MINUTE;

Результат:

2015-08-04 13:40:56
person Will B.    schedule 04.06.2019