特定の日から計算追加する係数テーブルを使用して休日の日付/減算日

Michi :

DB-フィドル

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いかなる条件が一致しない場合。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=32559&siteId=1