SQL Server 計算列で、和暦と消費税計算してみる
経緯
計算列を覚えておくために遊びたくて簡単に試した。
環境
日付型と通貨型のフィールドを持つテーブルを作成。
CREATE TABLE [dbo].[dummy2](
[SALES_DATE] [date] NULL,
[SALES_PRICE] [money] NULL,
);
テストデータの作成を作成。
「元号が切り替わる前日」「元号が切り替わった当日」「元号が切り替わった翌年」を SALES_PRICE が NULL の値としてセット。
INSERT INTO dummy2 (SALES_DATE, SALES_PRICE) VALUES('1868-01-24', null); -- 明治以前
INSERT INTO dummy2 (SALES_DATE, SALES_PRICE) VALUES('1868-01-25', null); -- 明治元年
INSERT INTO dummy2 (SALES_DATE, SALES_PRICE) VALUES('1869-01-01', null); -- 明治2年
INSERT INTO dummy2 (SALES_DATE, SALES_PRICE) VALUES('1912-07-29', null); -- 明治45年
INSERT INTO dummy2 (SALES_DATE, SALES_PRICE) VALUES('1912-07-30', null); -- 大正元年
INSERT INTO dummy2 (SALES_DATE, SALES_PRICE) VALUES('1913-01-01', null); -- 大正2年
INSERT INTO dummy2 (SALES_DATE, SALES_PRICE) VALUES('1926-12-24', null); -- 大正15年
INSERT INTO dummy2 (SALES_DATE, SALES_PRICE) VALUES('1926-12-25', null); -- 昭和元年
INSERT INTO dummy2 (SALES_DATE, SALES_PRICE) VALUES('1927-01-01', null); -- 昭和2年
INSERT INTO dummy2 (SALES_DATE, SALES_PRICE) VALUES('1989-01-07', null); -- 昭和64年
INSERT INTO dummy2 (SALES_DATE, SALES_PRICE) VALUES('1989-01-08', null); -- 平成元年
INSERT INTO dummy2 (SALES_DATE, SALES_PRICE) VALUES('1990-01-01', null); -- 平成2年
INSERT INTO dummy2 (SALES_DATE, SALES_PRICE) VALUES('2019-04-30', null); -- 平成31年
INSERT INTO dummy2 (SALES_DATE, SALES_PRICE) VALUES('2019-05-01', null); -- 新元号元年
INSERT INTO dummy2 (SALES_DATE, SALES_PRICE) VALUES('2020-01-01', null); -- 新元号2年
「消費税が切り替わる前日」「消費税が切り替わった当日」を SALES_PRICE が 1000 の値としてセット。
INSERT INTO dummy2 (SALES_DATE, SALES_PRICE) VALUES('1989-03-31', 1000); -- 消費税なし
INSERT INTO dummy2 (SALES_DATE, SALES_PRICE) VALUES('1989-04-01', 1000); -- 消費税3%
INSERT INTO dummy2 (SALES_DATE, SALES_PRICE) VALUES('1997-03-31', 1000); -- 消費税3%
INSERT INTO dummy2 (SALES_DATE, SALES_PRICE) VALUES('1997-04-01', 1000); -- 消費税5%
INSERT INTO dummy2 (SALES_DATE, SALES_PRICE) VALUES('2014-03-31', 1000); -- 消費税5%
INSERT INTO dummy2 (SALES_DATE, SALES_PRICE) VALUES('2014-04-01', 1000); -- 消費税8%
計算列の作成
計算列で和暦列の作成。
ALTER TABLE dbo.dummy2 ADD SALES_DATE_JP AS (CASE
WHEN [SALES_DATE] >= '2019-5-1' THEN
'新元号' + CASE
WHEN YEAR([SALES_DATE]) = 2019 THEN
'元'
ELSE
CONVERT(NVARCHAR, YEAR([SALES_DATE]) - 2019 + 1)
END
WHEN [SALES_DATE] >= '1989-1-8' THEN
'平成' + CASE
WHEN YEAR([SALES_DATE]) = 1989 THEN
'元'
ELSE
CONVERT(NVARCHAR, YEAR([SALES_DATE]) - 1989 + 1)
END
WHEN [SALES_DATE] >= '1926-12-25' THEN
'昭和' + CASE
WHEN YEAR([SALES_DATE]) = 1926 THEN
'元'
ELSE
CONVERT(NVARCHAR, YEAR([SALES_DATE]) - 1926 + 1)
END
WHEN [SALES_DATE] >= '1912-07-30' THEN
'大正' + CASE
WHEN YEAR([SALES_DATE]) = 1912 THEN
'元'
ELSE
CONVERT(NVARCHAR, YEAR([SALES_DATE]) - 1912 + 1)
END
WHEN [SALES_DATE] >= '1868-01-25' THEN
'明治' + CASE
WHEN YEAR([SALES_DATE]) = 1868 THEN
'元'
ELSE
CONVERT(NVARCHAR, YEAR([SALES_DATE]) - 1868 + 1)
END
ELSE
CONVERT(NVARCHAR, YEAR([SALES_DATE]))
END + FORMAT([SALES_DATE], '年MM月dd日')
) PERSISTED;
計算列で消費税込み SALES_PRICE 列の作成。
ALTER TABLE dbo.dummy2 ADD SALES_PRICE_WITH_TAX AS (CASE
WHEN [SALES_DATE] >= '2014-04-01' THEN
[SALES_PRICE] * 1.08
WHEN [SALES_DATE] >= '1997-04-01' THEN
[SALES_PRICE] * 1.05
WHEN [SALES_DATE] >= '1989-04-01' THEN
[SALES_PRICE] * 1.03
ELSE
[SALES_PRICE]
END
) PERSISTED;
テスト実行
和暦列テストデータの取得 (SALES_PRICE が NULL)
SELECT SALES_DATE, SALES_DATE_JP FROM dummy2 WHERE SALES_PRICE IS NULL ORDER BY SALES_DATE;
SALES_DATE SALES_DATE_JP
1868-01-24 1868年01月24日
1868-01-25 明治元年01月25日
1869-01-01 明治2年01月01日
1912-07-29 明治45年07月29日
1912-07-30 大正元年07月30日
1913-01-01 大正2年01月01日
1926-12-24 大正15年12月24日
1926-12-25 昭和元年12月25日
1927-01-01 昭和2年01月01日
1989-01-07 昭和64年01月07日
1989-01-08 平成元年01月08日
1990-01-01 平成2年01月01日
2019-04-30 平成31年04月30日
2019-05-01 新元号元年05月01日
2020-01-01 新元号2年01月01日
税込み列テストデータの取得 (SALES_PRICE が NULL 以外)
SELECT SALES_DATE, SALES_DATE_JP, SALES_PRICE, SALES_PRICE_WITH_TAX FROM dummy2 WHERE SALES_PRICE IS NOT NULL ORDER BY SALES_DATE;
SALES_DATE SALES_DATE_JP SALES_PRICE SALES_PRICE_WITH_TAX
1989-03-31 平成元年03月31日 1000.00 1000.000000
1989-04-01 平成元年04月01日 1000.00 1030.000000
1997-03-31 平成9年03月31日 1000.00 1030.000000
1997-04-01 平成9年04月01日 1000.00 1050.000000
2014-03-31 平成26年03月31日 1000.00 1050.000000
2014-04-01 平成26年04月01日 1000.00 1080.000000
ディスカッション
コメント一覧
まだ、コメントがありません