目次
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:24
→2022-10-04
と 06: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.最後に
今回は業務で要望があったので、いろいろな関数を調査しました。
間違いやご意見等ありましたらぜひ仰ってください。
読んでいただき、ありがとうございました。