Итак, у меня есть целое число «63605914755», например:
SELECT TO_SECONDS( '2015-08-04 13:40:56' )
-----
Result: '63605914755'
Как преобразовать «63605914755» обратно из секунд в дату и время (например: «2015-08-04 13:40:56»)?
Итак, у меня есть целое число «63605914755», например:
SELECT TO_SECONDS( '2015-08-04 13:40:56' )
-----
Result: '63605914755'
Как преобразовать «63605914755» обратно из секунд в дату и время (например: «2015-08-04 13:40:56»)?
SELECT
from_unixtime(seconds - to_seconds('1970-01-01 00:00:00')) as my_date_time
FROM
your_table
Вот SQLFiddle.
FROM_UNIXTIME
будут отключены. часовой пояс, используемый MySQL по умолчанию, равен SYSTEM
. , но можно изменить.
- person Will B.; 04.06.2019
Другой подход состоит в том, чтобы просто добавить количество секунд назад к базовой дате 0000-01-00
. Однако использование 0000-01-00
приведет к NULL
, поэтому мы должны указать первый день месяца 0000-01-01
.
Это приводит к смещению даты на 1 день. Чтобы учесть это, мы просто вычитаем 1 день из полученной даты:
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
часовой пояс a>.
Для 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