1

だから私がやろうとしていることは少しトリッキーです。指定された時間枠のカウントを返すことができる SQL クエリを考え出そうとしています。だから私はテーブル「v」を持っています。以下は、表 v の基本的なデータです。

Table v
_____________
id    p_id    created_at
 1     1      2009-06-09 18:54:17
 2     2      2009-06-09 21:51:24
 3     2      2009-06-10 18:53:51
 4     1      2009-06-10 01:20:36
 5     1      2009-06-10 11:20:36

基本的に、指定された期間 (時間、日、週、月、年) の結果を取得したいと考えています。私はこれを何日も機能させています...しかし、ゼロのカウントを含む時間枠の結果を返すことができません。基本的に、時間枠と区切り文字(時間、日など)を指定し、その時間枠内でテーブル v から行数を取得できるようにしたいと考えています。

これは私が現在試したことです:

select count(*) as count, date_format(created_at, "%m/%d/%y") as date from v where p_id = 56 group by date_format(created_at, "%m/%d/%y");

戻り値

+-------+-------------------------------------+
| count | date_format(created_at, "%m/%d/%y") |
+-------+-------------------------------------+
|     3 | 06/09/09                            | 
+-------+-------------------------------------+

しかし、これは時間枠を考慮していません。何か案は?

4

5 に答える 5

1

私がお勧めする通常のことは、次のようにすることです。

SELECT COUNT(*) AS `num`
FROM `table`
WHERE `created_at` >= '2009-09-06 00:00:00'
AND `created_at` < '2009-09-07 00:00:00'

つまり、日付/時間範囲内で直接クエリを実行します。これにより、タイムスパンのさまざまなスケールなどの問題に対処できます。テーブルに十分なレコードがあると、インデックスは役に立たなくなる可能性がありますが、結果created_atと比較するよりも優れているはずです。DATE_FORMATクエリ オプティマイザが私が信用しているよりもはるかに優れていない限り、DATE_FORMATインデックス作成をまったく利用するのではなく、すべての行に対して を実行して結果を比較します。

あなたの状況について私が処理していないことが原因で、これがうまくいかない、またはあなたがすでにそのようにしている可能性があると思いますが、それらが何であるかを確認するには、フィードバックを待つ必要があると思います.

于 2009-06-10T19:01:50.047 に答える
0
SELECT
  COUNT(*) AS cnt,
  DATE_FORMAT(created_at, "%m/%d/%y") AS my_date
FROM
  v
WHERE
  p_id = 56 AND 
  created_at BETWEEN first_date AND second_date
GROUP BY 
  DATE_FORMAT(created_at, "%m/%d/%y");
于 2009-06-10T19:09:19.643 に答える
0

日付ではなくタイムスタンプから:

SELECT COUNT(*)、DATE_FORMAT(FROM_UNIXTIME(created_at)、 "%m。%y")AS mDate FROM v GROUP BY mDate

于 2009-08-31T07:35:11.277 に答える
0

特定の期間のレコードがなくなると、その期間の合計を MySQL サーバーに送信する方法がありません。提案されたすべてのソリューション (あなたのものを含む) は機能しますが、レコードのない時間枠の行は返されません。

このクエリをアプリケーションで使用している場合は、グリッド上でゼロ カウントの行を手動で作成するか、結果を表示するために使用しているものを作成することをお勧めします。

于 2009-11-12T00:30:13.400 に答える
0
SELECT COUNT(*), created_at
FROM v
WHERE p_id = 56 
   and created_at >= sometime and created_at <= dateadd(hour,1,sometime)

日、年などを追加して、必要な時間枠を取得することもできます。

詳細については、次のリンクを参照してください: http://msdn.microsoft.com/en-us/library/ms186819.aspx

于 2009-06-10T19:31:15.637 に答える