2016-08-01 5 views
1

messagesというテーブルがあり、次の列のチャットからのメッセージを格納します。username, message, datetime、日付時刻の種類はTEXTで、次の形式で格納されます。 : "yyyy/MM/dd hh:mm:ss"。私は特定の時間範囲内の行の平均数を、日付を気にせずに取得したいと考えています。例えば:SQlite:日付を無視して特定の時間範囲内の行を選択

SELECT avg(count(message)) 
FROM messages 
WHERE datetime < "2016/mm/dd 13:00:00" AND 
     datetime > "2016/mm/dd 12:00:00" 

は、任意の文字は「ミリ」と「DD」の場所を取ることを可能にするいくつかの演算子があります。基本的には、特定の日付のメッセージの量ではなく、特定の時間範囲内の平均メッセージ量を取得するクエリを作成しようとしています。

答えて

0

私が正しくあなたの質問を読んでいる場合は、1213時間の間に2016のいずれかのカレンダーの日付を制限するために、あなたのWHERE句を使用します。この場合、STRFTIMEを使用して、datetime列から年と時を文字列形式で抽出することができます。

SELECT COUNT(message) 
FROM messages 
WHERE STRFTIME('%Y', datetime) = '2016' AND 
     STRFTIME('%H', datetime) < '13' AND 
     STRFTIME('%H', datetime) > '12' 

数値文字列はまだソート自分lexigraphical順に基づいているため不等式が文字列で動作するはずですしながら、理由があることに注意してください。

更新:

あなたのdatetime型のカラムが非標準形式であるので、あなたがWHERE句で使用する必要があるさまざまな部分をオフsubstringingことにより、この問題を回避することができる場合があります

SELECT COUNT(message) 
FROM messages 
WHERE SUBSTR(datetime, 1, 4) = '2016' AND 
     SUBSTR(datetime, 12, 2) < '13' AND 
     SUBSTR(datetime, 12, 2) > '12' 
+0

sqliteは年、月、日を区切ってハイフンで「YYYY-MM-DD HH:MM:SS.SSS」と書かれたdatetimesを受け入れるようですが、datetime文字列はスラッシュでフォーマットされています。 –

+0

@ J.Doe次に、日時を適切な形式に変換する必要があります。それはあなたの人生をはるかに簡単にします。これがなければ、この問題を解決するために非常に醜い文字列操作が必要になります。 –

+0

私は、各テーブルエントリをループし、それに応じてdatetime文字列を再フォーマットするプログラムを書く必要がありますか?これを行うにはいくつかの方法がありますか?さらに、AVG機能を使用しようとすると「集計」エラーが発生します。 COUNT(メッセージ)は、WHERE句を尊重するエントリの量を表す整数だけを返しますが、この情報のみで平均計算を実行することはできません。平均計算を実行するには、日数を知る必要があります。 –

関連する問題