0

MySQL の TIMEDIFF のように、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 を作成するにはどうすればよいでしょうか。それが 24 時間よりも大きい場合は、 and を使用して、それがどのくらいの高さであるかなどを示します。%H:%M:%S%d%Y%m

4

1 に答える 1

4

%Y-%m-%d ...少なくとも日付形式としてではなく、で時差を表すことはできません。1日未満の違いをどのように表現しますか?(0000-00-00 ...有効な日付ではありません)。また、月は何になりますか?30日?31日?23423432日?

私はあなたが数秒であなたの違いを保つことを提案します、そしてそれを提示するときあなたはそれを必要に応じて適応させます。

一方、あなたがあなたが尋ねたように本当にやりたいのであれば、ここに1つの方法があります:

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 に答える