Getting weeks between two dates in MySql


Dec 17, 2020    Janaki Mahapatra, Database

DELIMITER $$

DROP PROCEDURE IF EXISTS `sp_getDateFormat` $$
CREATE PROCEDURE `sp_getDateFormat`(StartDate varchar(15),  EndDate varchar(15),  Cond varchar(5))
    READS SQL DATA
    DETERMINISTIC
BEGIN
  DECLARE totalDay INT DEFAULT 0;
  DECLARE i int default 0;
  DECLARE newDate varchar(15);
  DECLARE toDate varchar(15);
  DECLARE totalWeek int default 0;
  DECLARE totalMonth int default 0;
  DECLARE totalYear int default 0;
  DECLARE j int default 0;


  IF Cond='d' THEN
    Select DATEDIFF(STR_TO_DATE(EndDate,'%m/%d/%Y'),STR_TO_DATE(StartDate,'%m/%d/%Y')) into totalDay;

    -- Creare temprary table
    DROP TEMPORARY TABLE IF EXISTS table_temp;
    CREATE TEMPORARY TABLE table_temp(
     `DateFrom` VARCHAR(15) NOT NULL,
     `DateTo` VARCHAR(15) NOT NULL
    ) ENGINE=Memory;
    -- Fisnsh------------------------------------------------------------

    WHILE i  <= totalDay DO
        Select DATE_ADD(STR_TO_DATE(StartDate,'%m/%d/%Y'),INTERVAL i day) into newDate;
        INSERT INTO table_temp VALUES (newDate,newDate);
        SET  i = i + 1;
    END WHILE;

  ELSEIF Cond='w' THEN
    Select DATEDIFF(STR_TO_DATE(EndDate,'%m/%d/%Y'),STR_TO_DATE(StartDate,'%m/%d/%Y')) into totalDay;
    Set totalWeek=CEILING(totalDay/7);
    Select STR_TO_DATE(StartDate,'%m/%d/%Y') into newDate;
    Select STR_TO_DATE(StartDate,'%m/%d/%Y') into toDate;

     -- Creare temprary table
    DROP TEMPORARY TABLE IF EXISTS table_temp;
    CREATE TEMPORARY TABLE table_temp(
     `DateFrom` VARCHAR(15) NOT NULL,
     `DateTo` VARCHAR(15) NOT NULL
    ) ENGINE=Memory;
    -- Fisnsh------------------------------------------------------------

   while i<totalWeek DO
      SELECT DATE_ADD(newDate,INTERVAL (1-DAYOFWEEK(newDate)) day) into newDate;
      SELECT DATE_ADD(toDate,INTERVAL (7-DAYOFWEEK(toDate)) day) into toDate;
      INSERT INTO adtinternal.table_temp VALUES (newDate,toDate);

      Select DATE_ADD(newDate,INTERVAL 7 day) into newDate;
      Select DATE_ADD(toDate,INTERVAL 7 day) into toDate;

      SET i=i+1;
   end while;

 ELSEIF Cond='m' THEN
    Select MONTH(STR_TO_DATE(EndDate,'%m/%d/%Y'))-MONTH(STR_TO_DATE(StartDate,'%m/%d/%Y')) into totalMonth;

    Select STR_TO_DATE(StartDate,'%m/%d/%Y') into newDate;
    Select STR_TO_DATE(EndDate,'%m/%d/%Y') into toDate;

     -- Creare temprary table
    DROP TEMPORARY TABLE IF EXISTS table_temp;
    CREATE TEMPORARY TABLE table_temp(
     `DateFrom` VARCHAR(15) NOT NULL,
     `DateTo` VARCHAR(15) NOT NULL
    ) ENGINE=Memory;
    -- Fisnsh------------------------------------------------------------

   while i<=totalMonth DO
      SELECT DATE_ADD(newDate,INTERVAL (1-DAYOFMONTH(newDate)) day) into newDate;
      SELECT DATE_ADD(newDate,INTERVAL (getDaysInMonth(MONTH(newDate),YEAR(newDate))-DAYOFMONTH(newDate)) day) into toDate;

      INSERT INTO adtinternal.table_temp VALUES (newDate,toDate);

      Select DATE_ADD(newDate,INTERVAL getDaysInMonth(MONTH(newDate),YEAR(newDate)) day) into newDate;
      -- Select DATE_ADD(toDate,INTERVAL getDaysInMonth(MONTH(newDate),YEAR(newDate)) day) into toDate;

      SET i=i+1;
    end while;


 ELSEIF Cond='y' THEN
    CREATE TEMPORARY TABLE table_temp(
     `DateFrom` VARCHAR(15) NOT NULL,
     `DateTo` VARCHAR(15) NOT NULL
    ) ENGINE=Memory;

  INSERT INTO adtinternal.table_temp VALUES (STR_TO_DATE(StartDate,'%m/%d/%Y'),STR_TO_DATE(EndDate,'%m/%d/%Y'));
END IF;
-- -------------------------------------------------------
  SELECT * from table_temp;

END $$

DELIMITER ;


-- and finally call the procedure as 
call sp_getDateFormat('01/01/2014','01/31/2014','w')