1

RailsのSQLiteのdatetime列でDATEによるグループ化がnilを返す理由を理解するのに苦労しています。日付でグループ化された startdate フィールドに値を持つユーザーの数を返したいと考えています。

誰でも助けることができますか?以下のクエリの DATE の側面を削除すると、期待どおりの結果が返されます。以下のさまざまなクエリと結果を参照してください。

User.where("startdate IS NOT NULL").group("DATE(startdate)").count

与える

SELECT COUNT(*) AS count_all, DATE(startdate) AS date_startdate 
FROM "users" 
WHERE (startdate IS NOT NULL) 
GROUP BY DATE(startdate)

=>{nil=>10}

私が期待するのは、日付の配列です (例: {"2013-06-04"=>3, "2013-06-10"=>4, "2013-06-11"=>3})。以下のクエリではこれには DATE 演算子がありません。結果は期待どおりですが、明らかに時間でグループ化したくありません (実際の DB では、同じ日付に異なる時間があります)。

User.where("startdate IS NOT NULL").group("(startdate)").count

与える

SELECT COUNT(*) AS count_all, (startdate) AS startdate 
FROM "users" 
WHERE (startdate IS NOT NULL) 
GROUP BY (startdate)  

=>{"2013-06-04 17:27:30.553802+0000"=>3, "2013-06-10 09:24:06.207327+0000"=>4, "2013-06-11 12:20:37.745819+0000"=>3}

4

4 に答える 4

2

SQLite がデータに期待する最も近い日付形式の文字列YYYY-MM-DD HH:MM:SS.SSSは です。

すべての日付が同じタイムゾーンに+0000ある場合は、関数をまったく無視DATEして部分文字列を比較できます。

User.where("startdate IS NOT NULL").group("SUBSTR(startdate,1,10)").count

とにかく、SQLite は日付の比較を実行しません。実際、DATE関数は常に を返しますTEXT

異なるタイムゾーンを処理する場合 (アプリケーションでそれらを処理することをお勧めします)、日付/時刻関数修飾子を使用して追加の計算を行うことができます。

編集:

@chuck.p.lee が私を正しく修正したので、最も近い形式は nowYYYY-MM-DD HH:MM:SS.SSS+HH:MMです。したがって、日付をこれに変換するのは、文字列操作 (サブミリ秒部分の切り捨て) を使用して非常に簡単です。

SUBSTR(startdate, 1, 23) || SUBSTR(startdate, 27, 3) || ':' || SUBSTR(startdate, 30,2)

これで、クエリは次のように正しく記述できます。

User.where("startdate IS NOT NULL").group("DATE(SUBSTR(startdate, 1, 23) || SUBSTR(startdate, 27, 3) || ':' || SUBSTR(startdate, 30,2))").count
于 2013-10-28T09:48:32.330 に答える
1

日付を mm/dd/yyyy 形式の文字列に変換し、その文字列でグループ化します

ms sql サーバー コードは次のようになります。

SELECT COUNT(*) AS count_all, convert(varchar(10),startdate, 101) AS date_startdate FROM      "users" WHERE (startdate IS NOT NULL) GROUP BY date_startdate
于 2013-10-27T08:19:24.813 に答える
-1

あなたのSQLクエリは正しく、RoRコマンドも同様です。

Postgresql で問題なく動作します。問題はsqliteでDATE関数を使用していると思います。大文字と小文字が区別される可能性があり、「DATE」の代わりに「date」関数を試す必要がありますが、これについてはわかりません。

于 2013-10-27T08:48:52.890 に答える