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;