8

SQLServer2005データベースに次のフィールドを含むテーブルがあります。

  • id, integer
  • value, string
  • create_date, datetime

このテーブルには常に新しいデータが挿入されているため(1日あたり数万レコード)、次のクエリを使用して、さまざまな日に挿入されたデータの量を比較します。

SELECT CONVERT(varchar(10), create_date, 101) as 'Date', COUNT(*) as 'Record Count',
FROM the_table
GROUP BY CONVERT(varchar(10), create_date, 101)
ORDER BY 'Date' desc

このクエリは、次のようなデータを返します。

12/20/2012 | 48155
12/19/2012 | 87561
12/18/2012 | 71467

ただし、今日このクエリを実行すると、データベース内の複数年分のデータで並べ替えが期待どおりに機能しないことに気付きました。今年のデータが結果セットの一番上にある代わりに、最後に一番下になりました(わかりやすくするためにレコードは省略されています)

06/29/2012 | 9987
01/04/2013 | 15768
01/03/2013 | 77586
01/02/2013 | 23566

フォーマットされた日付は単なる文字列であり、SQLサーバーが文字列以外のものとしてソートすることはおそらく期待できないため、これが発生する理由を理解しています。しかし、私は順序が正確であることを望みます。どうすればこれを達成できますか?(常に最新の日が最初に表示されます)

4

7 に答える 7

13

Odedの提案のおかげで、私は条項ごとに順序を変更しました。これにより、私が望むものが得られるようです。

SELECT CONVERT(varchar(10), create_date, 101) as 'Date', COUNT(*) as 'Record Count',
FROM the_table
GROUP BY CONVERT(varchar(10), create_date, 101)
ORDER BY MIN(create_date) desc
于 2013-01-04T19:36:35.987 に答える
4

に日付を日付データ型として含めて、でGROUP BY使用することができます。ORDER BY

SELECT top 100 CONVERT(varchar, create_date, 101) as 'Date', COUNT(*) as 'Record Count'
FROM constituent
GROUP BY CONVERT(varchar, create_date, 101), CONVERT(date, create_date)
ORDER BY CONVERT(date, create_date)
于 2013-01-04T19:40:30.697 に答える
0

文字列にキャストする代わりに、日付を午前12:00に切り捨てることができます。

SELECT dateadd(dd, datediff(dd, 0, create_date), 0) as 'Date'
     , COUNT(*) as 'Record Count',
  FROM the_table
 GROUP BY dateadd(dd, datediff(dd, 0, create_date), 0)
 ORDER BY dateadd(dd, datediff(dd, 0, create_date), 0) desc
于 2013-01-04T19:40:42.423 に答える
0

おそらくsubstrしてから、年の説明、月の昇順、日付の昇順で並べ替えることができます。

于 2013-01-04T21:18:00.103 に答える
0

データには、指定した2つの列のみ含まれている必要がありますか?そうでない場合は、( user1948904が提案したように)真夜中に切り捨てられた日付とformatted-dateフィールドを選択してから、日付フィールドで並べ替えることができます。次に、データを使用するすべての日付フィールドを無視できます。

元のクエリのエラーを修正し、formatted-dateフィールドをに追加するために編集されましたGROUP BY。これは必須です。

SELECT DATEADD(DAY, 0, DATEDIFF(DAY, 0, create_date)) AS raw_date,
        CONVERT(VARCHAR(10), create_date, 101) AS 'Date',
        COUNT(*) AS 'Record Count',
FROM the_table
GROUP BY DATEADD(DAY, 0, DATEDIFF(DAY, 0, create_date)),
        CONVERT(VARCHAR(10), create_date, 101)
ORDER BY raw_date DESC
于 2013-01-05T02:28:00.877 に答える
0

追加の冗長な日付列が必要ないため、またはクエリ内の情報を実際に集約していない場合はaを使用する必要があるため、他の回答は自分の状況に適さないと思いGROUP BYます(OPの質問に含まれていることを認めますcount(*)-私の場合は私を除いて同じです集計していません)。

このソリューションは、DATEADD()SQL Serverに実際の日付として処理させ、正しい順序を返すように強制するために、実際には何もしないを使用します。

SELECT    [Date]  = CONVERT(varchar(10), t.[create_date], 101)
          [Thing] = t.[other_column]     -- that I don't want to aggregate
FROM      [db].[dbo].[mytable] t
ORDER BY  DATEADD(dd, 0, t.[create_date]) DESC
于 2015-08-14T10:02:52.443 に答える
-1

私はsql-serverについて何も知りませんが、助けようとします。この列を日付型の列に置き換える必要があります。sql-serverはそれを正しくソートする方法を知っていると確信しています。

それが選択肢にない場合は、おそらくsql-serverで、文字列を日付型に変換する関数で注文できます。


ただし、ここではすでに日付型を使用しているようです。クエリを拡張して、日付タイプとしてselectに日付列を含め、変換された列ではなくその列で並べ替える必要があると思います。

于 2013-01-04T19:34:15.100 に答える