0

我想在 SQLite 中进行类似 MySQL 中的 TIMEDIFF 的函数调用。

我做的:

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

但这只是秒数。那么我如何制作一个 str ,比如小时、分钟和秒的差异%Y-%m-%d %H:%M:%S在哪里 %H:%M:%S,当它大于 24 小时时,将%d显示它是多少 dais 等等。%Y%m

4

1 回答 1

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 的反对票是不合理的,我也无法阻止自己解释为什么我上面提到的显然不是一个很好的选择在时差小于 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
于 2012-07-19T09:57:19.890 回答