8.9.7 ROUND
日時データを日時書式で指定した単位に丸めて返します。
数データを丸めるスカラ関数ROUNDについては,「8.4.9 ROUND」を参照してください。
- 〈この項の構成〉
(1) 指定形式
スカラ関数ROUND::=ROUND(日時データ,日時書式) 日時データ::=値式 日時書式::=定数
(2) 指定形式の説明
- 日時データ:
-
処理対象の日時データを指定します。
指定規則を次に示します。
-
日時データは,値式の形式で指定します。値式については,「7.21 値式」を参照してください。
-
日時データのデータ型は,DATE型,TIME型,またはTIMESTAMP型のどれかにしてください。
-
日時データには,?パラメタを単独で指定できません。
-
- 日時書式:
-
日時データを丸める単位を指定します。
指定規則を次に示します。
-
日時書式には,文字列定数を指定します。文字列定数については,「6.3 定数」を参照してください。
-
日時書式に指定できる要素を次の表に示します。
表8‒28 日時書式に指定できる要素 項番
日時書式に指定できる要素
単位
説明
1
CC
世紀
日時データが各世紀の51年目以降の場合は,翌世紀の最初の年の1月1日0時0分0秒に切り上げます。50年目以前の場合は,同世紀の最初の年の1月1日0時0分0秒に切り捨てます。
-
切り上げの例
ROUND(TIMESTAMP'1951-10-04 15:25:38','CC')
→TIMESTAMP'2001-01-01 00:00:00'
-
切り捨ての例
ROUND(TIMESTAMP'1950-10-04 15:25:38','CC')
→TIMESTAMP'1901-01-01 00:00:00'
2
YYYY
YYYYN
YY
YYN
年
日時データが7月1日以降の場合は,翌年の1月1日0時0分0秒に切り上げます。6月30日以前の場合は,同年の1月1日0時0分0秒に切り捨てます。
-
切り上げの例
ROUND(TIMESTAMP'2013-07-01 15:25:38','YYYY')
→TIMESTAMP'2014-01-01 00:00:00'
-
切り捨ての例
ROUND(TIMESTAMP'2013-06-30 15:25:38','YYYY')
→TIMESTAMP'2013-01-01 00:00:00'
3
Q
四半期
日時データが各四半期の2番目の月(2月,5月,8月,または11月)の16日以降の場合は,翌四半期の最初の月の1日0時0分0秒に切り上げます。15日以前の場合は,同四半期の最初の月の1日0時0分0秒に切り捨てます。
-
切り上げの例
ROUND(TIMESTAMP'2013-11-16 15:25:38','Q')
→TIMESTAMP'2014-01-01 00:00:00'
-
切り捨ての例
ROUND(TIMESTAMP'2013-11-15 15:25:38','Q')
→TIMESTAMP'2013-10-01 00:00:00'
1月1日を基準にして,3か月単位を四半期とします。
-
第1四半期:1月1日〜3月31日
-
第2四半期:4月1日〜6月30日
-
第3四半期:7月1日〜9月30日
-
第4四半期:10月1日〜12月31日
4
MONTH
MON
MM
月
日時データが16日以降の場合は,翌月の1日0時0分0秒に切り上げます。15日以前の場合は,同月の1日0時0分0秒に切り捨てます。
-
切り上げの例
ROUND(TIMESTAMP'2014-01-16 15:25:38','MONTH')
→TIMESTAMP'2014-02-01 00:00:00'
-
切り捨ての例
ROUND(TIMESTAMP'2014-01-15 15:25:38','MONTH')
→TIMESTAMP'2014-01-01 00:00:00'
5
WW
週
同年の最初の曜日を週の開始日とします。
日時データが,週の開始日から4日目の正午12時以降の場合は,翌週の開始日の0時0分0秒に切り上げます。4日目の正午12時より前の場合は,同週の開始日の0時0分0秒に切り捨てます。
-
切り上げの例
ROUND(TIMESTAMP'2014-01-04 15:25:38','WW')
→TIMESTAMP'2014-01-08 00:00:00'
2014年1月1日は水曜日のため,週の開始日は水曜日になります。そのため,その週の4日目(1月4日の土曜日)の正午12時以降の場合は,翌週の開始日(1月8日)の0時0分0秒に切り上げます。
-
切り捨ての例
ROUND(TIMESTAMP'2014-01-04 10:25:38','WW')
→TIMESTAMP'2014-01-01 00:00:00'
2014年1月1日は水曜日のため,週の開始日は水曜日になります。そのため,その週の4日目(1月4日の土曜日)の正午12時より前の場合は,同週の開始日(1月1日)の0時0分0秒に切り捨てます。
6
W
週
同月の最初の曜日を週の開始日とします。
日時データが,週の開始日から4日目の正午12時以降の場合は,翌週の開始日の0時0分0秒に切り上げます。4日目の正午12時より前の場合は,同週の開始日の0時0分0秒に切り捨てます。
-
切り上げの例
ROUND(TIMESTAMP'2014-02-04 12:25:38','W')
→TIMESTAMP'2014-02-08 00:00:00'
2014年2月1日は土曜日のため,週の開始日は土曜日になります。そのため,その週の4日目(2月4日の火曜日)の正午12時以降の場合は,翌週の開始日(2月8日)の0時0分0秒に切り上げます。
-
切り捨ての例
ROUND(TIMESTAMP'2014-02-04 11:55:38','W')
→TIMESTAMP'2014-02-01 00:00:00'
2014年2月1日は土曜日のため,週の開始日は土曜日になります。そのため,その週の4日目(2月4日の火曜日)の正午12時より前の場合は,同週の開始日(2月1日)の0時0分0秒に切り捨てます。
7
DAY
DAYN
DY
DYN
D
週
日曜日を週の開始日とします。
日時データが,週の開始日から4日目(水曜日)の正午12時以降の場合は,翌週の開始日の0時0分0秒に切り上げます。4日目の正午12時より前の場合は,同週の開始日の0時0分0秒に切り捨てます。
-
切り上げの例
ROUND(TIMESTAMP'2014-02-05 12:25:38','DAY')
→TIMESTAMP'2014-02-09 00:00:00'
2014年2月5日は水曜日です。そのため,2月9日(日曜日)の0時0分0秒に切り上げます。
-
切り捨ての例
ROUND(TIMESTAMP'2014-02-05 11:55:38','DAY')
→TIMESTAMP'2014-02-02 00:00:00'
2014年2月5日は水曜日です。そのため,2月2日(日曜日)の0時0分0秒に切り捨てます。
8
DD
DDD
日
日時データが正午12時以降の場合は,翌日の0時0分0秒に切り上げます。正午12時より前の場合は,同日の0時0分0秒に切り捨てます。
-
切り上げの例
ROUND(TIMESTAMP'2014-01-16 15:25:38','DD')
→TIMESTAMP'2014-01-17 00:00:00'
-
切り捨ての例
ROUND(TIMESTAMP'2014-01-16 10:25:38','DD')
→TIMESTAMP'2014-01-16 00:00:00'
9
HH
HH12
HH24
時
日時データが30分以降の場合は,翌時の0分0秒に切り上げます。29分以前の場合は,同時の0分0秒に切り捨てます。
-
切り上げの例
ROUND(TIMESTAMP'2014-01-16 15:35:38','HH')
→TIMESTAMP'2014-01-16 16:00:00'
-
切り捨ての例
ROUND(TIMESTAMP'2014-01-16 15:25:38','HH')
→TIMESTAMP'2014-01-16 15:00:00'
10
MI
分
日時データが30秒以降の場合は,翌分の0秒に切り上げます。29秒以前の場合は,同分の0秒に切り捨てます。
-
切り上げの例
ROUND(TIMESTAMP'2014-01-16 15:35:33','MI')
→TIMESTAMP'2014-01-16 15:36:00'
-
切り捨ての例
ROUND(TIMESTAMP'2014-01-16 15:35:28','MI')
→TIMESTAMP'2014-01-16 15:35:00'
11
SSSSS
SS
秒
日時データが500ミリ秒以降の場合は,翌秒に切り上げます。500ミリ秒未満の場合は,小数秒部分を切り捨てます。
-
切り上げの例
ROUND(TIME'11:59:30.596123','SS')
→TIME'11:59:31.000000'
-
切り捨ての例
ROUND(TIME'11:59:30.488123','SS')
→TIME'11:59:30.000000'
-
-
日時書式に指定する文字データは,半角文字で指定してください。また,大文字,小文字は区別されません。
-
日時書式に指定できる要素が複数ある場合,どれか1つを指定してください。どの要素を指定しても同じ実行結果になります。例えば,日時書式の要素としてYYYYとYYYYNのどちらを指定しても実行結果は同じになります。
-
日時書式の要素の前後の空白は無視されます。
-
日時書式の長さは,64バイト以内にしてください。
-
(3) 規則
-
実行結果のデータ型とデータ長を次の表に示します。
表8‒29 スカラ関数ROUNDの実行結果のデータ型とデータ長 日時データのデータ型とデータ長
実行結果のデータ型とデータ長
DATE
DATE
TIME(p)
TIME(p)
TIMESTAMP(p)
TIMESTAMP(p)
(凡例)p:小数秒精度
-
実行結果の値は,非ナル値制約なし(ナル値を許す)となります。
-
日時データがナル値の場合,実行結果はナル値になります。
-
日時データがDATE型の場合に,日時書式に時刻を丸める指定(DDD,DD,HH,HH12,HH24,MI,SSSSS,またはSS)をしたときは,入力された日時データをそのまま返します。
-
日時データにTIME型のデータを指定した場合,日時書式に世紀,年,四半期,月,週,日を丸める指定(CC,YYYY,YYYYN,YY,YYN,Q,MONTH,MON,MM,WW,W,DAY,DAYN,DY,DYN,D,DDD,またはDD)はできません。
-
日時データがDATE型の場合,時刻要素には00:00:00が仮定されます。そのため,次のような指定をしたときは,週単位の切り捨てが行われます。
(例)
ROUND(DATE'2013-10-04','W') → DATE'2013-10-01'
-
実行結果のデータ型がDATE型の場合,実行結果が1年1月1日〜9999年12月31日の範囲に収まらないとエラーになります。
-
実行結果のデータ型がTIME型の場合,実行結果が0時0分0.000000000000秒〜23時59分59.999999999999秒の範囲に収まらないとエラーになります。
-
実行結果のデータ型がTIMESTAMP型の場合,実行結果が1年1月1日の0時0分0.000000000000秒〜9999年12月31日の23時59分59.999999999999秒の範囲に収まらないとエラーになります。
(4) 例題
- 例題
-
販売履歴表(SALESLIST)から,商品コード(PUR-CODE)P001の商品の販売個数を半期ごと(2013年1/1〜6/30までと,2013年7/1〜12/31まで)に集計します。
SELECT SUM("PUR-NUM") FROM "SALESLIST" WHERE "PUR-DATE" BETWEEN DATE'2013-01-01' AND DATE'2013-12-31' AND "PUR-CODE"='P001' GROUP BY ROUND("PUR-DATE",'YYYY')
日時書式の要素にYYYYを指定した場合,7月1日以降のデータは切り上げ対象となります。また,6/30以前のデータは切り捨ての対象となります。そのため,1/1〜6/30を上半期,7/1〜12/31を下半期とした半期ごとの集計ができます。