【问题标题】:MySQL convert seconds to datetimeMySQL将秒转换为日期时间
【发布时间】:2015-08-04 06:42:22
【问题描述】:

所以我有一个像这样的整数 '63605914755':

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

如何将“63605914755”从秒转换回日期时间(例如:“2015-08-04 13:40:56”)?

【问题讨论】:

标签: mysql datetime seconds


【解决方案1】:
SELECT
  from_unixtime(seconds - to_seconds('1970-01-01 00:00:00')) as my_date_time
FROM 
  your_table

这是SQLFiddle

【讨论】:

  • '63605914755' 是秒,它不是 UNIX 时间戳。您的解决方案返回 NULL。
  • 如果您的 MySQL 服务器有一个时区偏移,请小心,这将导致 FROM_UNIXTIME 的结果关闭。 timezone MySQL 默认使用的是SYSTEM,但可以更改。
【解决方案2】:

另一种方法是简单地将秒数添加回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 Epoch 日期基于 UTC,因此当您的 MySQL 服务器使用带有偏移量的时区时,使用 FROM_UNIXTIME(seconds - seconds_from_epoch),生成的日期时间将偏离该偏移量。 default timezone used by MySQL is the SYSTEM timezone.
对于 EST,使用 FROM_UNIXTIME 将导致 2015-08-04 09:40:56

要解决此问题,您需要计算UTC_TIMESTAMPCURRENT_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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-22
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多