Is there a way to extract the starting time and the ending time of this type of text data in SQL? 'Monday|7:00-17:00' I need to calculate the difference and get the number of hours.
I tried SUBSTR but since the days have different lengths MONDAY, TUESDAY, etc., it doesn't work.
CodePudding user response:
You can use a mix of SUBSTR and INSTR functions to retrieve the hours like this:
SELECT SUBSTR('Monday|7:00-17:00', INSTR('Monday|7:00-17:00','|') 1, 100);
CodePudding user response:
Take a peek at this example: https://dbfiddle.uk/HyMsdfoJ
select dt
, instr(dt, '|')
, substr(dt, instr(dt, '|') 1, 100)
, instr(substr(dt, instr(dt, '|') 1, 100), '-')
, substr(
substr(dt, instr(dt, '|') 1, 100),
1,
instr(substr(dt, instr(dt, '|') 1, 100), '-') - 1
) as starttime
, substr(
substr(dt, instr(dt, '|') 1, 100),
instr(substr(dt, instr(dt, '|') 1, 100), '-') 1,
100
) as endtime
from (select 'Saturday|9:00-11:00' as dt) t
You can change select 'Saturday|9:00-11:00' as dt to select 'Mon|17:00-18:00' as dt and try it again.
In the query above, I break down the problem by:
- finding the position where
|exists. If the text wasMon|17:00-18:00, that'd be position 4 - extracting the text after
|using substr, which would be17:00-18:00 - finding the position of
-in17:00-18:00, which would be 6 - putting learnings from the above 3 items to get the start time
- I take the text after
|(17:00-18:00) and extract from position 1 to position 5 - That gives me 17:00
- I take the text after
- repeat a similar technique to get end time
- I take the text after
-in 17:00-18:00 by extracting 100 characters after position 7 - 100 is an arbitrary number I chose. You can get more sophisticated with a bit of math and extract the exact length
- I take the text after
Here's another example with a table: http://sqlfiddle.com/#!5/4f347/2/0
