参考資料:FLOOR関数、DATEPART関数、CAST関数、CONVERT関数、DATEADD関数、DATEDIFF関数、CASE式

2024-04-02

SQL Serverで日付時刻列を時間考慮せずにグループ化する

SQL Serverで日付時刻列をグループ化する際、時間情報も考慮すると、グループ数が多くなり、分析が複雑になる場合があります。そこで、時間情報を無視してグループ化する方法を紹介します。

方法

以下の2つの方法があります。

FLOOR関数は、指定された精度で数値を切り捨てます。日付時刻列に対してFLOOR関数を使うことで、時間情報を切り捨てて日付のみでグループ化できます。

SELECT FLOOR(date_time_column) AS date_only, COUNT(*) AS count
FROM table_name
GROUP BY date_only
ORDER BY date_only;

DATEPART関数は、日付時刻列から指定された日付要素を抽出します。DATEPART関数を使って、日付時刻列から時間要素のみを抽出 and 0 を加算することで、時間情報を無視して日付のみでグループ化できます。

SELECT DATEPART(dd, date_time_column) + DATEPART(mm, date_time_column) * 100 + DATEPART(yy, date_time_column) * 10000 AS date_only, COUNT(*) AS count
FROM table_name
GROUP BY date_only
ORDER BY date_only;

以下のテーブルがあるとします。

CREATE TABLE table_name (
  id INT,
  date_time_column DATETIME
);

INSERT INTO table_name (id, date_time_column) VALUES
  (1, '2024-03-27 10:00:00'),
  (2, '2024-03-27 11:00:00'),
  (3, '2024-03-28 12:00:00'),
  (4, '2024-03-28 13:00:00');
SELECT FLOOR(date_time_column) AS date_only, COUNT(*) AS count
FROM table_name
GROUP BY date_only
ORDER BY date_only;

結果

date_only | count
----------+-------
2024-03-27 | 2
2024-03-28 | 2
SELECT DATEPART(dd, date_time_column) + DATEPART(mm, date_time_column) * 100 + DATEPART(yy, date_time_column) * 10000 AS date_only, COUNT(*) AS count
FROM table_name
GROUP BY date_only
ORDER BY date_only;
date_only | count
----------+-------
20240327 | 2
20240328 | 2

上記の2つの方法を使うことで、SQL Serverで日付時刻列を時間考慮せずにグループ化できます。

補足

  • 上記の例では、日付のみでグループ化していますが、月や年など、他の日付要素でグループ化することもできます。
  • GROUP BY 句で複数の列を指定することで、複数の列でグループ化できます。



CREATE TABLE table_name (
  id INT,
  date_time_column DATETIME
);

INSERT INTO table_name (id, date_time_column) VALUES
  (1, '2024-03-27 10:00:00'),
  (2, '2024-03-27 11:00:00'),
  (3, '2024-03-28 12:00:00'),
  (4, '2024-03-28 13:00:00'),
  (5, '2024-03-29 14:00:00'),
  (6, '2024-03-29 15:00:00'),
  (7, '2024-03-30 16:00:00'),
  (8, '2024-03-30 17:00:00');

方法1:FLOOR関数を使う

SELECT FLOOR(date_time_column) AS date_only, COUNT(*) AS count
FROM table_name
GROUP BY date_only
ORDER BY date_only;
date_only | count
----------+-------
2024-03-27 | 2
2024-03-28 | 2
2024-03-29 | 2
2024-03-30 | 2

方法2:DATEPART関数を使う

SELECT DATEPART(dd, date_time_column) + DATEPART(mm, date_time_column) * 100 + DATEPART(yy, date_time_column) * 10000 AS date_only, COUNT(*) AS count
FROM table_name
GROUP BY date_only
ORDER BY date_only;
date_only | count
----------+-------
20240327 | 2
20240328 | 2
20240329 | 2
20240330 | 2

方法3:GROUP BY 句で複数の列を指定する

SELECT YEAR(date_time_column) AS year, MONTH(date_time_column) AS month, COUNT(*) AS count
FROM table_name
GROUP BY YEAR(date_time_column), MONTH(date_time_column)
ORDER BY YEAR(date_time_column), MONTH(date_time_column);
year | month | count
-----+-------+-------
2024 | 3    | 8
  • 上記のサンプルコードは、SQL Server 2019で動作確認しています。
  • 他のデータベースを使用する場合は、構文が異なる場合があります。



日付時刻列を時間考慮せずにグループ化する他の方法

CAST関数は、データ型を変換します。日付時刻列を文字列型に変換することで、時間情報を無視してグループ化できます。

SELECT CAST(date_time_column AS DATE) AS date_only, COUNT(*) AS count
FROM table_name
GROUP BY date_only
ORDER BY date_only;
SELECT CONVERT(VARCHAR(10), date_time_column, 120) AS date_only, COUNT(*) AS count
FROM table_name
GROUP BY date_only
ORDER BY date_only;
SELECT DATEADD(date_time_column, -HOUR(date_time_column), HOUR) AS date_only, COUNT(*) AS count
FROM table_name
GROUP BY date_only
ORDER BY date_only;
SELECT DATEDIFF(date_time_column, '00:00:00') AS date_only, COUNT(*) AS count
FROM table_name
GROUP BY date_only
ORDER BY date_only;

T-SQL の CASE 式を使うことで、日付時刻列の値に基づいて異なる値を返すことができます。CASE 式を使って、時間情報に基づいて異なる値を返すことで、時間情報を無視してグループ化できます。

SELECT CASE
  WHEN HOUR(date_time_column) BETWEEN 0 AND 5 THEN '00:00:00'
  WHEN HOUR(date_time_column) BETWEEN 6 AND 11 THEN '06:00:00'
  WHEN HOUR(date_time_column) BETWEEN 12 AND 17 THEN '12:00:00'
  ELSE '18:00:00'
END AS date_only, COUNT(*) AS count
FROM table_name
GROUP BY date_only
ORDER BY date_only;

sql sql-server t-sql


親テーブルと子テーブルのデータ構造を変更して「Cannot delete or update a parent row: a foreign key constraint fails」エラーを根本的に解決する

このエラーが発生する理由は、外部キー制約が原因です。外部キー制約は、子テーブルの列が親テーブルの列を参照し、データの整合性を保つために設けられます。つまり、親テーブルのレコードを削除または更新しようとすると、子テーブルに関連するレコードが存在すると、外部キー制約によってエラーが発生します。...


データ移行も楽々!SQLite3への.sqlファイルインポート完全ガイド

方法1:SQLite3コマンドラインツールを使うターミナルを開き、SQLite3コマンドラインツールを起動します。.importコマンドを使って、インポートしたい. sqlファイルを指定します。data. sql: インポートしたい. sqlファイル...


SQLで効率的に名前を検索する5つの方法(アンダースコア問題も解決!)

この動作は、_ 文字がワイルドカードとして解釈されるためです。ワイルドカードは、1 文字または 0 文字に一致する特殊な文字です。つまり、_ を含むパターンは、その位置に任意の文字 (または何もない) が一致する可能性があることを意味します。...


【初心者向け】MariaDB/SQLレコード数取得:3つの基本方法と状況別最適解

COUNT(*) を使用する最も一般的で簡単な方法は、COUNT(*) 関数を使用することです。これは、すべての行をカウントし、テーブル内のレコード数を返します。この方法は、シンプルなクエリでレコード数を取得したい場合に適しています。information_schema...