【PL/SQL】日付型のあれこれ
今日は日付型の値の扱い方について説明するわね。
それと、ちょっとおまけも。
PL/SQLと言うか、SQLでもだいたい共通よ。
値の扱い方?
うげ。なんだか難しそうだな。
日付型の基本
値の扱い方の前に、
日付型に値を代入するのを覚えようね。
ついでに、日付型を文字列にするのも書いておくわね。
DECLARE
AAA DATE;
BBB DATE;
CCC CHAR(14);
BEGIN
AAA := SYSDATE; --(1)
BBB := TO_DATE('2020/07/17'); --(2)
CCC := TO_CHAR(AAA, 'YYYYMMDDH24MISS'); --(3)
END;
(1)でシステム日付を代入しているんだな。
(2)で文字列から日付型に変換して代入しているんだな。
(3)で日付型を「年月日時分秒」の文字列にしてるんだな。
あら、魔理沙
知っていたのね。
それじゃ次、行きましょう!
日数の加減算
オラクルの日付型で、翌日とか前日を求めるのは
どうやるか知ってる?
「未来はまだ白紙」だよな
ドク・・・。
(ドクって誰なのよ・・・w)
下にコードを載せるわね。
DECLARE
AAA DATE := SYSDATE;
BBB DATE;
CCC DATE;
BEGIN
BBB := AAA + 1; --(1)翌日
CCC := AAA - 1; --(2)前日
END;
オラクルで前日、翌日は
日付型に「- 1」、「+ 1」でやります。
例えば、「- 7」すると一週間前になるわ。
簡単だな!オイ!
月の加減算
月の加減算も説明しま~す。
下にコードを載せるわね。
DECLARE
AAA DATE;
BBB DATE;
BEGIN
AAA := ADD_MONTHS(SYSDATE, 12); --(1)
BBB := ADD_MONTHS(SYSDATE, -12); --(2)
END;
「ADD_MONTHS」関数を使いま~す。
(1)は12ヶ月後を求めるわ。
(2)は12ヶ月前を求めるわ。
関数の第2引数で決まるのね!
こりゃまた簡単だな!オイ!
月末の算出
おまけコーナー♪
月末の算出も下に載せるわね。
DECLARE
AAA DATE := TO_DATE('2020/06/12');
BBB DATE;
CCC DATE;
DDD DATE;
BEGIN
BBB := LAST_DAY(AAA); --(1)6月の月末(2020/06/30)
CCC := ADD_MONTHS(BBB, 1); --(2)6月の翌月(2020/07/31)
DDD := CCC + 1; --(3)月末に+1日
END;
月末は「LAST_DAY」関数を使いま~す。
(1)で6月の月末を算出しているわ。
(2)で6月の月末の+1ヶ月を算出しているわ。
6月の月末「06/30」、7月の月末「07/31」に自動でなるのよ。
2月の月末や閏年も自動で算出されるわ。
(3)月末の翌日は月初よ。「2020/07/31」の翌日は「2020/08/01」
ありゃま!簡単だな!オイ!
ループで応用
それじゃあ、ループで応用しま~す。
下にコードを載せるわね。
DECLARE
AAA DATE := SYSDATE;
TYPE TYP_DATE IS TABLE OF DATE INDEX BY PLS_INTEGER;
BBB TYP_DATE; --日付型の配列
CCC TYP_DATE; --日付型の配列
BEGIN
FOR I IN 1..10
LOOP
BBB(I) := AAA + I; --(1)「日」の加算
END LOOP;
FOR I IN 1..12
LOOP
CCC(I) := ADD_MONTHS(AAA, I); --(2)「月」の加算
END LOOP;
END;
(1)はループで、1~10を日に加算した値を、それぞれ配列にいれているわ。
(2)はループで、1~12を月に加算した値を、それぞれ配列にいれているわ。
なるヘソ・ザ・ワールド
そして時は動き出す。
日付型の話はどうだったかしら?
魔理沙が別の次元へ行きかけてるので
このへんで終わるわね。
またね~。