On 2015-07-30 10:59 PM, jose isaias cabrera wrote:
>
> Ok, I have one more option for you, and since you think it's fun, I 
> need to exclude Saturdays and Sundays.  I have a hack in the 
> programming side of things, but I would like to do it right from 
> SQLite.  Thougths?

    WITH DTBase(HrsToAdd, DayStartsAt, HrsPerDay, HrsNow) AS (SELECT
         5.5,
         8.5,
         8.5,
         (CAST(strftime('%H','now','localtime') AS
    REAL)+(CAST(strftime('%M','now','localtime') AS REAL)/60)-8.5)

    ), DTFill(HrsToFillToday,HrsRemain) AS (SELECT
         MAX(HrsPerDay-HrsNow,0),
         MAX(HrsToAdd-MAX(HrsPerDay-HrsNow,0),0)
         FROM DTBase

    ), DTDays(DaysToAdd,DayHrsToAdd) AS (SELECT
         CAST((HrsRemain/HrsPerDay) AS INT),
         (HrsRemain-(CAST((HrsRemain/HrsPerDay) AS INT)*HrsPerDay))
         FROM DTFill,DTBase

    ), DTTime(DaysToAdd,DayHrsToAdd) AS (SELECT DaysToAdd,
         (DayStartsAt+(CASE WHEN HrsRemain>0 THEN DayHrsToAdd+24 ELSE
    HrsNow+HrsToFillToday END))
         FROM DTBase,DTFill,DTDays

    ), NewDT(NewDateTime) AS (SELECT
         datetime( 'now', 'localtime', 'start of day', '+'||DaysToAdd||'
    days', '+'||DayHrsToAdd||' hours') AS NewTime
         FROM DTTime

    ), WkEnd(WEDays) AS (
         SELECT ((CAST(DaysToAdd AS INT)/7)*2) FROM DTTime
         UNION ALL
         SELECT (WEDays+1) FROM WkEnd,NewDT WHERE
    (strftime('%w',datetime(NewDateTime,'+'||WEDays||' day')) IN ('0','6'))
    )
    SELECT datetime( 'now', 'localtime', 'start of day',
    '+'||(MAX(DaysToAdd)+MAX(WEDays))||' days', '+'||MAX(DayHrsToAdd)||'
    hours') AS NewTime
    FROM DTTime, WkEnd;



Wait... Let me guess... next you want Holidays added too, right?

Well, just in case you do... here is the SQL:
(Just add your own country's Holidays in the HDays CTE)

    WITH DTBase(HrsToAdd, DayStartsAt, HrsPerDay, HrsNow) AS (SELECT
         5.5,
         8.5,
         8.5,
         (CAST(strftime('%H','now','localtime') AS
    REAL)+(CAST(strftime('%M','now','localtime') AS REAL)/60)-8.5)

    ), HDays(HoliDay) AS (
         SELECT '01-01' UNION ALL  -- New Year's
         SELECT '05-01' UNION ALL  -- Worker's
         SELECT '07-04' UNION ALL  -- Independence
         SELECT '12-25'            -- Xmas

    ), DTFill(HrsToFillToday,HrsRemain) AS (SELECT
         MAX(HrsPerDay-HrsNow,0),
         MAX(HrsToAdd-MAX(HrsPerDay-HrsNow,0),0)
         FROM DTBase

    ), DTDays(DaysToAdd,DayHrsToAdd) AS (SELECT
         CAST((HrsRemain/HrsPerDay) AS INT),
         (HrsRemain-(CAST((HrsRemain/HrsPerDay) AS INT)*HrsPerDay))
         FROM DTFill,DTBase

    ), DTTime(DaysToAdd,DayHrsToAdd) AS (SELECT DaysToAdd,
         (DayStartsAt+(CASE WHEN HrsRemain>0 THEN DayHrsToAdd+24 ELSE
    HrsNow+HrsToFillToday END))
         FROM DTBase,DTFill,DTDays

    ), NewDT(NewDateTime) AS (SELECT
         datetime( 'now', 'localtime', 'start of day', '+'||DaysToAdd||'
    days', '+'||DayHrsToAdd||' hours') AS NewTime
         FROM DTTime

    ), WkEnd(WEDays) AS (
         SELECT ((CAST(DaysToAdd AS INT)/7)*2) FROM DTTime
       UNION ALL
         SELECT (WEDays+1) FROM WkEnd,NewDT
          WHERE (strftime('%w',datetime(NewDateTime,'+'||WEDays||'
    day')) IN ('0','6')) OR
    (strftime('%m-%d',datetime(NewDateTime,'+'||WEDays||' day')) IN
    (SELECT Holiday FROM HDays))

    )
    SELECT datetime( 'now', 'localtime', 'start of day',
    '+'||(MAX(DaysToAdd)+MAX(WEDays))||' days', '+'||MAX(DayHrsToAdd)||'
    hours') AS NewTime
    FROM DTTime, WkEnd;


Reply via email to