sqlite - 像MySQL一样制作TIMEDIFF

时间:2012-07-19 08:58:08

标签: sqlite timedelta

我想在MySQL中创建一个像SQLite一样有效的函数调用。

我做到了:

select strftime('%s','2012-01-01 12:00:00') - strftime('%s','2004-01-01 02:34:56')

但这只是秒数。那么我如何制作像%Y-%m-%d %H:%M:%S这样的str %H:%M:%S,其中%d是小时,分钟和秒的差异,当它大于24小时后,%Y将显示它是多少和依此类推%m和{{1}}。

1 个答案:

答案 0 :(得分:4)

您无法用%Y-%m-%d ...表示时差,至少不能表示日期格式。你怎么表达不到一天的差异? (0000-00-00 ...不是有效日期)。还有,一个月会是什么? 30天? 31天? 23423432天?

我建议您在几秒钟内保持差异,并在呈现时根据需要进行调整。

另一方面,如果你真的想按照你的要求去做,这是一种方式:

sqlite> select datetime(strftime('%s','2012-01-01 12:00:00') 
               - strftime('%s','2004-01-01 02:34:56') - 62167305600, 'unixepoch');
0007-12-31 09:25:04

即使我认为OP的downvote是不合理的,我也不能阻止自己解释为什么我在上面提到的显然不是一个非常好的选择当时间差小于1时返回“不正确”的结果日:我在上面写的内容暗示了原因:没有0000-00-00 ...这样的日期,因此返回的日期时间为负值:-001-12-31 ...

这是获取438:53:45的方法,但它非常复杂:

earlier date: d1
later date: d2

select 
    cast(
        (strftime('%s', d2) - strftime('%s', d1)) / 86400 * 24 
             + cast(strftime("%H", time(strftime('%s', d2) 
                    - strftime('%s', d1), 'unixepoch')) 
               as int) 
    as text) 
    || ":" 
    ||  substr(time(strftime('%s', d2) - strftime('%s', d1), 'unixepoch'), 4);

示例:

d1 = '2004-01-01 02:34:56'
d2 = '2012-01-01 12:00:00'

sqlite> select cast((strftime('%s','2012-01-01 12:00:00') - strftime('%s','2004-01-01 02:34:56')) / 86400 *24 + cast(strftime("%H", time(strftime('%s','2012-01-01 12:00:00') - strftime('%s','2004-01-01 02:34:56'), 'unixepoch'))  as int) as text) 
    || ":" 
    ||  substr(time(strftime('%s','2012-01-01 12:00:00') - strftime('%s','2004-01-01 02:34:56'), 'unixepoch'), 4);
70137:25:04