Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- id | someDatas | deadline1 | deadline2 | deadline3 | deadline4 | deadline5
- ---+-----------+-----------+-----------+-----------+-----------+-----------
- | | | | | |
- id | name
- ---+-----
- |
- id | id_demand | someOthersDatas | id_status
- ---+-----------+-----------------+----------
- | | |
- SELECT dem.*, st.`name` as 'statusName'
- FROM `status` st
- INNER JOIN `events` eve
- ON eve.id_status = st.id
- INNER JOIN `demand` dem
- ON eve.id_demand = dem.id
- WHERE st.`name` IN ('A', 'B', 'C', 'D')
- AND eve.id IN
- (
- SELECT MAX(even.id) ev
- FROM `demand` de
- INNER JOIN `events` even
- ON even.id_demand = de.id
- GROUP BY de.id
- );
- DROP TEMPORARY TABLE IF EXISTS pendingDemands;
- CREATE TEMPORARY TABLE IF NOT EXISTS pendingDemands
- SELECT /* the query shown above */
- delimiter //
- CREATE FUNCTION `easter_f`(X INTEGER) RETURNS date
- BEGIN
- DECLARE K,M,S,A,D,R,OG,SZ,OE,OS INT;
- DECLARE EASTERDATE DATE;
- SET K = X DIV 100;
- SET M = 15 + (3*K + 3) DIV 4 - (8*K + 13) DIV 25;
- SET S = 2 - (3*K + 3) DIV 4;
- SET A = X MOD 19;
- SET D = (19*A + M) MOD 30;
- SET R = (D + A DIV 11) DIV 29;
- SET OG = 21 + D - R ;
- SET SZ = 7 - (X + X DIV 4 + S) MOD 7;
- SET OE = 7 - (OG - SZ) MOD 7;
- SET OS = OG + OE;
- SET EASTERDATE = date_add(concat(X, '-03-01'), INTERVAL OS-1 DAY);
- RETURN EASTERDATE;
- END//
- DROP TEMPORARY TABLE IF EXISTS days_off;
- CREATE TEMPORARY TABLE IF NOT EXISTS days_off
- (
- date_off VARCHAR(5)
- );
- INSERT INTO days_off VALUES('01-01'),
- ('05-01'),
- ('05-08'),
- ('07-14'),
- ('08-15'),
- ('11-01'),
- ('11-11'),
- ('12-25');
- delimiter //
- DROP FUNCTION IF EXISTS `isDayOff`;
- CREATE FUNCTION `isDayOff`(d DATETIME) RETURNS BOOL
- BEGIN
- SET @monthDay = (SELECT DATE_FORMAT(d, '%m-%d'));
- SET @easter = (SELECT easter_f(YEAR(d)));
- SET @dayWeek = (SELECT DAYOFWEEK(d));
- SET @result = if (@dayWeek = 1
- OR @dayWeek = 7
- OR (SELECT COUNT(*) FROM days_off WHERE date_off = @monthDay) > 0
- OR DATE_ADD(@easter, INTERVAL 1 DAY) = d
- OR DATE_ADD(@easter, INTERVAL 40 DAY) = d
- OR DATE_ADD(@easter, INTERVAL 50 DAY) = d,
- TRUE,
- FALSE);
- RETURN (@result);
- END//
- DELIMITER //
- DROP FUNCTION IF EXISTS `get_next_valid_date`;
- CREATE FUNCTION `get_next_valid_date`(MyDate DATETIME) RETURNS DATETIME
- BEGIN
- REPEAT
- SET MyDate = (DATE_ADD(MyDate, INTERVAL 1 DAY));
- SET @someCondition = (select isDayOff(MyDate));
- UNTIL (@someCondition = 0) END REPEAT;
- RETURN MyDate;
- END//
Add Comment
Please, Sign In to add comment