LoginSignup
6
2

More than 1 year has passed since last update.

【SQLServer】datetimeを分割して取得する

Last updated at Posted at 2022-10-08

目次

1. やりたいこと
2. 環境
3. 調査
 3-1. 日付のみ
  (1)LEFT関数
  (2)SUBSTRING関数
  (3)CAST関数
  (4)CONVERT関数
  (5)おまけ:スラッシュにしたい
  (6)補足:CAST関数とCONVERT関数の違い
 3-2. 時刻のみ
4. 最終的なコード
5. 参考
6. 最後に

1.やりたいこと

SQLServerのとあるテーブルに、日時というカラムがあります。

データ型はdatetimeです。

datetimeのフォーマットは以下です。
YYYY-MM-DD hh:mm:ss[.nnn]

今回はもともとあるデータを何とか使って日付と時刻を分けたかったので、調査してまとめました。
例:2022-10-04 6:56:242022-10-0406:56:24 に分ける。

2.環境

  • windows10 バージョン21H2
  • Microsoft-IIS 10.0
  • Microsoft SQLServer Management Studio 18.12.1

3.調査

いろんな関数を使ってどのような結果になるのか調査しました。

3-1.日付のみ

(1)LEFT関数

ハイフンを含めた先頭10文字を指定することで、2022-10-04と取得ができないかと思い試しました。

<実行したSQL>

SELECT
id,
name,
LEFT(time, 10) AS '日付'
FROM test_DB

<結果>
10 04 2022が取得できました。

(2)SUBSTRING関数

指定した文字列を切り取って返す関数です。SQLServerとMySQLで使うことができるため、試しました。

SUBSTRING関数
SUBSTRING([文字列], [切り取り開始地点], [切り取る文字数]);

  • 第一引数:文字列
  • 第二引数:切り取りの開始地点
  • 第三引数:切り取る文字数

<実行したSQL>

SELECT
id,
name,
SUBSTRING(time, 1, 10) AS '日付'
FROM test_DB

<結果>
「引数の数が対応していない」旨のエラーが表示されました。

第一引数は文字列とあるので、一度文字列に変換する必要があります。

CAST関数で文字列に変換し、第一引数とすることでエラーが解消できました。

CAST関数
CAST ( 任意の有効な式 AS 対象のデータ型 [ ( データ型の長さ ) ] )
あるデータ型の式を別のデータ型に変換します。

<実行したSQL>

SELECT
id,
name,
SUBSTRING(CAST(time AS nvarchar), 1, 10) AS '日付'
FROM test_DB

<CAST関数を使った後の結果>
10 04 2022が取得でき、LEFT関数と同じ結果になりました。

(3)CAST関数

(2)でいったん文字列に変換することが手間だと感じたので、「CAST関数で一回で取得できないか?」と考えました。

<実行したSQL>

SELECT
id,
name,
(CAST(time AS date)) AS '日付'
FROM test_DB

(2)のSUBSTRING関数では文字列に変換しましたが、今回はdateを指定しました。

<結果>
dateの既定の形式がYYYY-MM-DDなので、2022-10-04と取得することができました。

(4)CONVERT関数

CAST関数と同様で、あるデータ型の式を別のデータ型に変換する関数として
CONVERT関数があります。
CONVERT関数でも取得できるか、試してみました。

CONVERT関数
CONVERT ( ( 対象のデータ型 [ ( データ型の長さ ) ] ) , 任意の式 [ , 任意の式を変換する方法を指定する整数式 ] )

<実行したSQL>

SELECT
id,
name,
(CONVERT(date, time)) AS '日付'
FROM test_DB

<結果>
CAST関数と同様で、2022-10-04と取得することができました。

(5)おまけ:スラッシュにしたい

datetime型のデータから日付のみ取得したいという目的は達成できたのですが、2022-10-04ではなく、2022/10/04というように「スラッシュにすることはできるのかな?」と考えました。

<実行したSQL>

SELECT
id,
name,
(CONVERT(nvarchar, time, 111)) AS '日付'
FROM test_DB

<結果>
CONVERT関数の最後に整数式を指定してできました。

CONVERT関数
CONVERT ( ( 対象のデータ型 [ ( データ型の長さ ) ] ) , 任意の式 [ , 任意の式を変換する方法を指定する整数式 ] )

任意の式の後に111 を入れることで 既定の形式であるyyyy/mm/ddにすることができます。

(6)補足:CAST関数とCONVERT関数の違い

CONVERT関数はSQLServerの独自機能で、CAST関数はISO に準拠しています。

3-2.時刻のみ

時刻については(5)と同様の式で取得することができます。

<実行したSQL>

SELECT
id,
name,
(CONVERT(nvarchar, time, 108)) AS '時間'
FROM test_DB

<結果>
108 を入れることで 既定の形式であるhh:mi:ssにすることができます。
114にするとミリ秒(hh:mi:ss:mmm)まで取得可能です。

4.最終的なコード

CONVERT関数を使用することで日付と時間を分割できました。

SELECT
id,
name,
(CONVERT(date, time)) AS '日付',
(CONVERT(nvarchar, time, 108)) AS '時間'
FROM test_DB

5.参考

6.最後に

今回は業務で要望があったので、いろいろな関数を調査しました。
間違いやご意見等ありましたらぜひ仰ってください。
読んでいただき、ありがとうございました。

6
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2