Michi :
CREATE TABLE holidays (
id int primary key,
name VARCHAR(255),
calc_type VARCHAR(255),
calc_factor VARCHAR(255)
);
INSERT INTO holidays
(id, name, calc_type, calc_factor
)
VALUES
("1", "Holdiay_01", "fixed", "0"),
("2", "Holdiay_02", "fixed", "0"),
("3", "Holdiay_03", "fixed", "0"),
("4", "Holdiay_04", "moveable", "10"),
("5", "Holdiay_05", "moveable", "-5");
私は計算に使用する上記の表date
のSQLクエリで休日のを。
休日は、二つの異なるに分割されていますcalculation types
。
固定 =同日付毎年
(YYYY-03-01, YYYY-05-12, YYYY-08-09)
可動 =日付(日数の事前定義された量を減算/加算することにより算出されるcalc_factor
固定された日から)。
(YYYY-11-12) + 10, (YYYY-11-12) - 5
最終的に結果は次のようになります。
id name date
1 Holiday_01 2019-03-01
2 Holiday_02 2019-05-12
3 Holiday_03 2019-08-09
4 Holiday_04 2019-11-22
5 Holiday_05 2019-11-07
私はこのような何かで行くことを試みたが、それは今のところ動作させることができませんでした。
SELECT
id,
name,
CASE (
WHEN name = "Holdiay_01" THEN DATE_ADD(YEAR(CURDATE()) & MONTH(3) & DAY(1), INTERVAL calc_factor)
WHEN name = "Holdiay_02" THEN DATE_ADD(YEAR(CURDATE()) & MONTH(5) & DAY(12), INTERVAL calc_factor)
WHEN name = "Holdiay_03" THEN DATE_ADD(YEAR(CURDATE()) & MONTH(9) & DAY(8), INTERVAL calc_factor)
WHEN name = "Holdiay_04" THEN DATE_ADD(YEAR(CURDATE()) & MONTH(11) & DAY(12), INTERVAL calc_factor)
WHEN name = "Holdiay_05" THEN DATE_ADD(YEAR(CURDATE()) & MONTH(11) & DAY(12), INTERVAL calc_factor)
ELSE NULL END ) AS date
FROM holidays;
どのように私は期待される結果を得るために、私のクエリを変更することがありますか?
ゴードン・リノフ:
休日についての行ではなく、日付 - あなたはかなりひねくれたデータモデルを持っています。それは次のようにあなたが休日の名前を固定した後、何をしたいん、言いました:
SELECT id, name,
(CASE WHEN name = 'Holiday_01' THEN DATE_ADD(CONCAT(YEAR(CURDATE()), '-03-01'), INTERVAL calc_factor DAY)
WHEN name = 'Holiday_02' THEN DATE_ADD(CONCAT(YEAR(CURDATE()), '-05-12'), INTERVAL calc_factor DAY)
WHEN name = 'Holiday_03' THEN DATE_ADD(CONCAT(YEAR(CURDATE()), '-09-08'), INTERVAL calc_factor DAY)
WHEN name = 'Holiday_04' THEN DATE_ADD(CONCAT(YEAR(CURDATE()), '-11-12'), INTERVAL calc_factor DAY)
WHEN name = 'Holiday_05' THEN DATE_ADD(CONCAT(YEAR(CURDATE()), '-11-12'), INTERVAL calc_factor DAY)
END) as date
FROM holidays;
ここでは、対応するDB <>フィドルです。
スペルミスの名前から離れてあなたのコードを持ついくつかの問題:
&
ビット単位でAND
演算子。あなたはそう、日付を構築したいように見えるCONCAT()
が適切です。INTERVAL
時間単位が必要です。MONTH()
そしてDAY()
日付からそれらの成分を抽出する機能です。例えば、「3」のように引数を日付に変換される-それは日付ではありませんので、返された値ですNULL
。- 簡素化の問題として、
ELSE NULL
ので、不必要であるCASE
式が返すNULL
いかなる条件が一致しない場合。