by shigemk2

当面は技術的なことしか書かない

2018 SQL Puzzle 1

SQLパズル 第2版~プログラミングが変わる書き方/考え方

SQLパズル 第2版~プログラミングが変わる書き方/考え方

メモ。オリジナルのクエリをそのまま実行してもエラーになるのでいくつか直している

Oracle EE 12.1.0.2.v10

-- 変更点
-- INTERVAL '365' DAYは12.1ではエラー ORA-00920: invalid relational operator になる
-- INTERVALが364になることもあるので=を<=にした
-- メモ
-- CONSTRAINT 制約 (EXTRACTとあわせて)
-- start_dateはfiscal_yearより1年前
-- start_dateは10/1
-- end_dateは9/30
CREATE TABLE FiscalYearTable1
(fiscal_year INTEGER NOT NULL PRIMARY KEY,
 start_date DATE NOT NULL,
    CONSTRAINT valid_start_date
    CHECK((EXTRACT (YEAR FROM start_date) = fiscal_year - 1)
               AND (EXTRACT (MONTH FROM start_date) = 10)
               AND (EXTRACT (DAY FROM start_date) = 01)),
 end_date DATE NOT NULL,
    CONSTRAINT valid_end_date
    CHECK((EXTRACT (YEAR FROM end_date) = fiscal_year)
               AND (EXTRACT (MONTH FROM end_date) = 09)
               AND (EXTRACT (DAY FROM end_date) = 30)),
    CONSTRAINT valid_interval
    CHECK ((end_date - start_date) <= 365));

INSERT INTO FiscalYearTable1 VALUES(1995, DATE '1994-10-01', DATE '1995-09-30');
INSERT INTO FiscalYearTable1 VALUES(1997, DATE '1996-10-01', DATE '1997-09-30');
INSERT INTO FiscalYearTable1 VALUES(1998, DATE '1997-10-01', DATE '1998-09-30');

-- 終了日が8月
INSERT INTO FiscalYearTable1 VALUES(1996, DATE '1995-10-01', DATE '1996-08-30');
-- 開始日が2日
INSERT INTO FiscalYearTable1 VALUES(1999, DATE '1998-10-02', DATE '1999-09-30');

http://www.geocities.jp/mickindex/database/db_support_sqlpuzzle.html#LocalLink-p1