データベースで日付を扱っていないデータベースはないといっても良いほど重要な要素です。
SQLを学習している方もまずはこういった”絶対不可欠な要素”から学習していくべきだと思いますので、この記事では日付に関する記事を書きたいと思います。
中でも今回は「曜日」の算出に使われる関数について具体的なコードも踏まえて解説していきますので、現在学習中の方は必見です!
曜日にまつわる関数について
曜日の取得には「DATEPART関数」と「DATENAME関数」という二つの方法がありますが、それぞれ関数が違います。
どちらが使いやすいかというモノではなく、ケースによってこれら二つの関数のどちらを使用するか選択することになるため、両方覚えておきましょう。
DATEPART関数
まず一つ目は「DATEPART」を使って取得する方法です。
まず解説の前にDATEPART関数の記述について見ていきましょう。
DATEPART関数は次のように記述します。
DATEPART ( [datepart] , [date] )
第一引数の「datepart」の戻り値は、この関数(DATEPART)によって整数が返されるdate(第二引数)の特定部分となります。
※なお今回の記事では「weekday」を使用して解説を進めていきますが、”datepart”引数は次の中から指定することが出来ます。
datepart | 省略形 |
---|---|
year | yy, yyyy |
quarter | qq, q |
month | mm, m |
dayofyear | dy, y |
day | dd, d |
week | wk, ww |
weekday | dw |
hour | hh |
minute | mi, n |
second | ss, s |
millisecond | ms |
microsecond | mcs |
nanosecond | ns |
tzoffset | tz |
iso_week | isowk, isoww |
逆に言うとこれ以外はリファレンスにも「DATEPART は、datepart引数に関して、ユーザー定義変数に相当するものは受け入れられません。」としっかり明記されていますので、指定することが出来ません。
第二引数の「date」には、データ型の中でも時間に関係したものを入れることが出来ます。
具体的には次を見てください。
- date
- datetime
- datetimoeoffset
- datetime2
- smalldatetime
- time
ただしdatepartとは違い、この第二引数のdateには、列式、式、文字列リテラル、ユーザー定義の変数を指定することも出来ます。
記述方法に関しての説明は以上です。
それでは次に具体的な取得方法について解説していきます。
まず次のサンプルコードをご覧ください。
SELECT DATEPART(weekday, '2020-07-27') GO ----------- 2
今回の記事は曜日についての解説を行っているため、サンプルコードでは第一引数に「weekday」を使用しています。
個のクエリを実行すると、「2」という数字が返ってきます。
理由としては、DATPART関数は戻り値の型が”int”の関数となっているためです。
そしてこの戻り値は”SET DATEFIRST”で設定された値となります。
今回は”SET DATEFIRST”の説明は省略しますが、デフォルトでは”日曜日”が週初めに設定されています。
2020年7月27日は「月曜日」に該当する日付なので、結果として2が返ってきたというわけです。
またこのDATEPART関数の第一引数は先ほどの表にも記載した通り、省略形で記述することも出来ます。
省略形での記述は次の通りです。
SELECT DATEPART(dw, '2020-07-27') GO ----------- 2
当然ですが、結果は同じものが返ってくることが確認できます。
DATENAME関数
二つ目はDATENAMEを使って取得する方法です。
こちらもまずは記述方法から見ていきましょう。
DATENAME ( [datepart] , [date] )
このDATENAME関数はDATEPART関数とは対照的に、指定されたdateの指定されたdatepartの戻り値を”文字列”で返します。
なおこのDATENAME関数の第一引数、第二引数についての詳細は先ほど解説したDATEPART関数の第一引数及び第二引数の説明に同じです。
ではこちらも実際にコードで確認してみましょう。
次のサンプルコードを見てください。
SELECT DATEPART(weekday, '2020-07-27') GO ----------- 月曜日
先ほどDATEPART関数で使ったコードと同じものですが、今度は曜日が直接返ってきていることが確認できます。
規定値について
DATEPART関数及びDATENAME関数どちらにも同一の注意すべき点がありますので簡単に解説していきます。
第二引数のに存在しない第一引数を指定した場合は、第二引数にリテラルが含まれる場合にのみ、第一引数で指定したdatepartの規定値を返します。
なお日付に関する規定値は「1900-01-01」となっていますので、これを基準にした戻り値が返ってきます。
実際に次のコードを見ていただくとご理解いただけると思います。
SELECT DATENAME(year, '12:10:30.123') AS "year", DATENAME(month, '12:10:30.123') AS "month", DATENAME(day, '12:10:30.123') AS "day", DATENAME(dayofyear, '12:10:30.123') AS "dayofyear", DATENAME(weekday, '12:10:30.123') AS "weekday"; GO year month day dayofyear weekday --------- --------- --------- --------- --------- 1900 01 1 1 月曜日
このサンプルコードでは、第一引数で第二引数のリテラルに存在しないdatepartを指定しています。
結果、日付の規定値である「1900-01-01」を基に計算された値が返ってきていることが確認できます。
曜日の表記を自由に変更する
ここまでは曜日に関する二つの関数についての解説を行ってきましたが、ここからは小技的なコードの紹介をしたいと思います。
DATENAME関数を使うと”月曜日”のような形式で表記されますが、これはSQL Serverの言語によって変わってきます。
とはいってもそう簡単にコロコロ変更するようなものでもない為、表記を変更したい場合には「CASE式」を使って次のように記述することで解決できます。
SELECT CASE DATEPART(weekday, GETDATE()) WHEN 1 THEN 'Sun' WHEN 2 THEN 'Mon' WHEN 3 THEN 'Tue' WHEN 4 THEN 'Wed' WHEN 5 THEN 'Thu' WHEN 6 THEN 'Fri' WHEN 7 THEN 'Sat' END GO ----------- Mon
まとめ
いかがでしたか?
今回の記事ではSQLの日付の中でも「曜日」に焦点を当てて解説してみました。
日付を扱うケースは非常に沢山出てくるため、必ずマスターしておくようにしましょう。
リテラルとは、変数や定数以外の数値や文字列の事です。
“Hello world”や12345、2020-07-27などこれらは全てリテラルとなります。