DATEPART, DATENAME関数


 ITコーディネータのシュウです。

IMG_0075

 先日、長女がイルミージュという西武遊園地で行われているイルミネーションを見に行って、それを撮った写真をくれたので、アップしてみました。10月24日から来年の4月10日まで16:00~21:00の間、開催しているようですね。いろいろと写真をくれたのですが、どれもとってもきれいでした。この時期は、各地でイルミネーションの催しがありますが、西武遊園地については知らなかったです。

西武遊園地と言えば、妻と一緒になる前に二人で行ったことのある特別な思い出の場所でもあり、そのときのことを懐かしく思い出します。あの頃は、妻に会えることが本当に嬉しくて、二人でアトラクションに乗ったことも結構鮮明に覚えていますね。
まだこういうイルミネーションなどはなかったですけどね。
しばらく忘れていた記憶を甦らせてくれた娘に感謝します。

さて話は変わりますが、dbSheetのユーザ事例として、Access版を採用した産業用電気機器卸売業の会社の事例がホームページに上がっています。既存のAccessの営業支援システムを、データをRDBMSで一元管理しつつ、国内10拠点で運用可能なシステムに短期間で移行させることができたという内容です。興味のある方はぜひご参照ください。
http://www.newcom07.jp/dbsheetclient/usrvoice/electric_wholesale.html

<本日の題材>
DATEPART, DATENAME関数

最近関わったシステムで、日付とともに曜日を各列の列名の部分に表示しつつ、各日毎の計画数量などの集計値を各行に表示する帳票を作成するというものがありました。
対象のDBがSQL Serverであったので、対象の日付の曜日を表示するのに、DATEPART関数というものを使用しました。今回はこれを取り上げてみたいと思います。

構文は、
DATEPART(datepart, date)

引数としての datepart には日付の要素を指定し、その後ろに確認したい日付を指定します。この関数の戻り値は int型になります。
日付の要素としての datepart には以下のようなものがあります。

  year, yyyy, yy  :年
  quarter, qq, q  :4半期
 month, mm, m :月
 dayofyear, dy, y :年の何日目
 day, dd, d      :日
 week, wk, ww  :年の第何週
 weekday, dw   :曜日
 hour, hh       :時刻の何時
 minute, n      :時刻の分
 second, ss, s    :時刻の秒
 millisecond, ms :時刻のミリ秒
 microsecond, mcs :時刻のマイクロ秒
 nanosecond, ns :時刻のナノ秒
 …..他

今回は、曜日を確認したいので、weekday または dw を使います。
ただし、戻り値は、SET DATEFIRST を使って設定された値に依存します。SET DATEFIRST は、週の最初の曜日を示す整数値を指定するもので、SET DATEFIRST 1 というようにしますが、
  1:月曜日
  2:火曜日
  3:水曜日
  4:木曜日
  5:金曜日
  6:土曜日
  7:日曜日(デフォルト)
となります。カレンダーを見ても、1週間の始まりが日曜日というのが既定値ですね。

例)
それでは、今日の日付が何曜日なのかを確認します。
まず、今日が何日かを確認します。

SELECT CONVERT(VARCHAR, GETDATE(), 111)

datepart_getdate

「2015-12-13」は日曜日ですが、SQLでDATEPART関数を使って確認すると、

SELECT DATEPART(dw, GETDATE())

デフォルトの状態(SET DATEFIRST 7)では、日曜日を週の最初と見なすので、結果は以下のように「1」となります。

datepart_dw

ついでに、今年の第何週目かを確認すると、

SELECT DATEPART(wk, GETDATE())

detepart_wk

また、DATEPART関数は、戻り値が int型でしたが、戻り値が nvarchar型で同様に日付の要素についての結果を戻す関数として、DATENAME関数というものがあります。

SELECT DATENAME(dw, GETDATE())

datename

「日曜日」ではなく、最初の「日」だけでよければ、最初の1文字のみを取得すればよいと思います。

datename2

ときに、システムによっては、月曜日を週の開始日として、曜日や第何週目かを確認したい場合もあるかも知れません。このときは SET DATEFIRST 1 としてから上記の処理を実施します。確認してみると、

SET DATEFIRST 1
SELECT DATEPART(dw,GETDATE()), DATEPART(wk,GETDATE());

SELECT DATENAME(dw, GETDATE()), LEFT(DATENAME(dw, GETDATE()),1);

firstdate7_datepart

 週の始まりが月曜日という指定をすることで、今日「2015-12-13」は、DATEPART(dw, GETDATE())では「7」、そして第50週めという結果になりました。DATENAMEでの曜日は日曜日で同じ結果になります。

上記は、ORACLEでも TO_CHAR関数を使用することで同様な内容を行うことができます。
まず、今日の日付を確認します。

SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM DUAL;

56_ora_sysdate

次に、今日が何曜日か、年初から第何週目か、また月での何週目かを確認します。

SELECT
  TO_CHAR(SYSDATE, 'D')    AS 曜日
, TO_CHAR(SYSDATE, 'DY')   AS 曜日名略
, TO_CHAR(SYSDATE, 'DAY')  AS 曜日名
, TO_CHAR(SYSDATE, 'WW')   AS 年初からの週
, TO_CHAR(SYSDATE, 'W')    AS 月初からの週
  FROM DUAL;

56_ora_to_char

Oracleでは、TO_CHAR関数を利用して様々な内容を取得してくることができますね。

今日は以上まで

にほんブログ村 IT技術ブログへ
にほんブログ村

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>