SQLServer

【SQLSERVER】日付型に関するテクニック集

SQLServerで、日付に関するデータ型を操作する方法を紹介します。
もちろん、SQLServer2019、2016,2008などバージョンに依存せずに使えます。

日付を文字列に変換

SQLServerに関する日付型の変換において、2つの関数を用いることができます。

CAST関数

現在日時を文字列型に変換してみましょう。

PRINT CAST(CURRENT_TIMESTAMP AS VARCHAR);

実行結果は以下のようになります。

May 8 2021 9:58AM

SSMSの設定により多少は表示結果が異なるかもしれませんが、「月、日、年、時刻(AM/PM)」という並びになるでしょう。
私たちがよく利用する「yyyy/mm/dd hh:mm:ss」という表示はCAST関数ではできません。

このような日付変換をしたい場合には「CONVERT関数」を利用します。

CONVERT関数

現在の日付を変換してみましょう。

PRINT CONVERT(VARCHAR, CURRENT_TIMESTAMP, 111);

第3引数の「111」ですが、変換方法のパラメータになります。
国によって主流の表記があり、日本ではおもに「111」の「yyyy/mm/dd」または「11」の「yy/mm/dd」を用います。
その他の内容はCAST および CONVERT (Transact-SQL)

実行結果は以下のようになります。

2021/05/08

和暦日時で出力したい

和暦で出力する場合については、Format関数を組み合わせる必要があります。

-- 今日の日付を和暦日付にする
PRINT FORMAT(GETDATE(), N'yyyy年MM月dd日')

-- 指定日付を和暦日付にする
PRINT FORMAT(CONVERT(DATETIME, '2020/01/01'), N'yyyy年MM月dd日')

このようにすることで和暦日時の変換が可能です。
いずれにせよ日付型にしてFormat関するより指定した形にするという流れになるので注意が必要です。

おまけ

最後に業務で使えそうな「期間重複」を調べるSQLを紹介します。
予約システムなどの日時がかなり重要になるテーブルもつシステム開発では重宝するかもしれません。

■TASKテーブル(練習用)を作成

CREATE TABLE TASK_TBL
(
  [開始日時] DATETIME,
  [終了日時] DATETIME
);

INSERT INTO TASK_TBL ([開始日時], [終了日時]) VALUES (CONVERT(DATETIME, '2019-01-01'), CONVERT(DATETIME, '2019-01-31'));
INSERT INTO TASK_TBL ([開始日時], [終了日時]) VALUES (CONVERT(DATETIME, '2019-02-01'), CONVERT(DATETIME, '2019-02-28'));
INSERT INTO TASK_TBL ([開始日時], [終了日時]) VALUES (CONVERT(DATETIME, '2019-03-01'), CONVERT(DATETIME, '2019-03-31'));
INSERT INTO TASK_TBL ([開始日時], [終了日時]) VALUES (CONVERT(DATETIME, '2019-04-01'), CONVERT(DATETIME, '2019-04-30'));
INSERT INTO TASK_TBL ([開始日時], [終了日時]) VALUES (CONVERT(DATETIME, '2019-05-01'), CONVERT(DATETIME, '2019-05-31'));
INSERT INTO TASK_TBL ([開始日時], [終了日時]) VALUES (CONVERT(DATETIME, '2019-07-01'), CONVERT(DATETIME, '2019-07-31'));
INSERT INTO TASK_TBL ([開始日時], [終了日時]) VALUES (CONVERT(DATETIME, '2019-08-01'), CONVERT(DATETIME, '2019-08-31'));
INSERT INTO TASK_TBL ([開始日時], [終了日時]) VALUES (CONVERT(DATETIME, '2019-09-01'), CONVERT(DATETIME, '2019-09-30'));
INSERT INTO TASK_TBL ([開始日時], [終了日時]) VALUES (CONVERT(DATETIME, '2019-10-01'), CONVERT(DATETIME, '2019-10-31'));
INSERT INTO TASK_TBL ([開始日時], [終了日時]) VALUES (CONVERT(DATETIME, '2019-11-01'), CONVERT(DATETIME, '2019-11-30'));
INSERT INTO TASK_TBL ([開始日時], [終了日時]) VALUES (CONVERT(DATETIME, '2019-12-01'), CONVERT(DATETIME, '2019-12-31'));
-- 新規で追加する開始日時を定義
DECLARE @開始日時 DATETIME;
SET @開始日時 = '2019-06-01';

-- 新規で追加する終了日時を定義
DECLARE @終了日時 DATETIME;
SET @終了日時 = '2019-06-10';

-- 重複有無を判定
SELECT  CASE
      WHEN COUNT('X') > 0 THEN N'重複'
      ELSE				   N'なし'
    END AS 結果
FROM TASK_TBL
WHERE ((@開始日時 <= 開始日時) AND (@終了日時 >= 開始日時) AND (@終了日時 <= 終了日時) )
OR ((@開始日時 >= 開始日時) AND (@開始日時 <= 終了日時) AND (@終了日時 >= 開始日時) AND (@終了日時 <= 終了日時))
OR ((@開始日時 >= 開始日時) AND (@開始日時 <= 終了日時) AND (@終了日時 >= 終了日時))
OR ((@開始日時 <= 開始日時) AND (@終了日時 >= 終了日時))

実行結果は以下のようになります。

なし

ポイントはCOUNT(‘X’)です。
WHEREの条件に該当するレコードがあればXの件数が分かり、0より大きい値であれば「重複」となります。
WHERE句の条件は複雑ですが、INPUTの値をそれぞれテーブルのカラムで比較するようにしております。