SQL: как найти максимальное время, когда его тип varchar2 - PullRequest
0 голосов
/ 26 мая 2018

У меня есть вопрос, в котором я должен найти информацию о магазине из таблицы магазинов, которая открывается в последний раз в выходные.в таблице магазина у меня есть атрибут с именем выходные часы с типом varchar2, например: (10:00 - 17:00).Я пытался To_char (S.WeekendHours = max (S.WeekendHours), но он не работает !! как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Вы можете использовать регулярное выражение для извлечения времени открытия и закрытия, а затем манипулировать ими по мере необходимости:

SELECT s.*,
       TRIM(REGEXP_SUBSTR(s.weekend_hours, '[0-9]+:*[0-9]* *(am|pm)*', 1, 1)) AS OPENING_HOUR_STRING,
       TRIM(REGEXP_SUBSTR(s.weekend_hours, '[0-9]+:*[0-9]* *(am|pm)*', 1, 2)) AS CLOSING_HOUR_STRING
      FROM STORE s

Как только у вас есть базовая информация выше, вы можете манипулировать ею, чтобы получить открытие ивремя закрытия в качестве даты, затем используйте MAX в соответствующем поле:

WITH cteSTORE_STRING_VALUES AS
       (SELECT s.*,
               TRIM(REGEXP_SUBSTR(s.weekend_hours, '[0-9]+:*[0-9]* *(am|pm)*', 1, 1)) AS OPENING_HOUR_STRING,
               TRIM(REGEXP_SUBSTR(s.weekend_hours, '[0-9]+:*[0-9]* *(am|pm)*', 1, 2)) AS CLOSING_HOUR_STRING
          FROM STORE s),
     cteALL_STORE_VALUES AS
       (SELECT s.*,
               CASE
                 WHEN LENGTH(OPENING_HOUR_STRING) < 4 THEN LPAD(OPENING_HOUR_STRING, 4, '0')
                 ELSE OPENING_HOUR_STRING
               END AS PADDED_OPENING_STRING,
               CASE
                 WHEN LENGTH(CLOSING_HOUR_STRING) < 4 THEN LPAD(CLOSING_HOUR_STRING, 4, '0')
                 ELSE CLOSING_HOUR_STRING
               END AS PADDED_CLOSING_STRING
          FROM cteSTORE_STRING_VALUES s),
     cteSTORES_WITH_HOURS AS
       (SELECT a.*,
               CASE
                 WHEN UPPER(SUBSTR(a.OPENING_HOUR_STRING, -3)) IN (' AM', ' PM') THEN
                   TO_DATE(a.OPENING_HOUR_STRING, 'HH:MI AM')
                 WHEN UPPER(SUBSTR(a.OPENING_HOUR_STRING, -2)) IN ('AM', 'PM') THEN
                   TO_DATE(a.OPENING_HOUR_STRING, 'HH:MIAM')
                 WHEN INSTR(a.OPENING_HOUR_STRING, ':') > 0 THEN
                   TO_DATE(a.OPENING_HOUR_STRING, 'HH24:MI')
                 ELSE
                   TO_DATE(a.PADDED_OPENING_STRING, 'HH24MI')
               END AS OPENING_HOURS,
               CASE
                 WHEN UPPER(SUBSTR(a.CLOSING_HOUR_STRING, -3)) IN (' AM', ' PM') THEN
                   TO_DATE(a.CLOSING_HOUR_STRING, 'HH:MI AM')
                 WHEN UPPER(SUBSTR(a.CLOSING_HOUR_STRING, -2)) IN ('AM', 'PM') THEN
                   TO_DATE(a.CLOSING_HOUR_STRING, 'HH:MIAM')
                 WHEN INSTR(a.CLOSING_HOUR_STRING, ':') > 0 THEN
                   TO_DATE(a.CLOSING_HOUR_STRING, 'HH24:MI')
                 ELSE
                   TO_DATE(a.PADDED_CLOSING_STRING, 'HH24MI')
               END AS CLOSING_HOURS
          FROM cteALL_STORE_VALUES a)
SELECT *
  FROM cteSTORES_WITH_HOURS
  WHERE OPENING_HOURS = (SELECT MAX(OPENING_HOURS)
                           FROM cteSTORES_WITH_HOURS);

SQLFiddle здесь

Удачи.

0 голосов
/ 26 мая 2018

Если вы хотите, чтобы магазин открывал самое последнее, вы, вероятно, могли бы сделать:

select t.*
from t
order by t.weekendhours desc
fetch first 1 row only;

Однако, с вашим форматом времени, это не будет работать, потому что 2:00 утра будет после 1:00 pm

Итак, вам нужно преобразовать диапазон во время.Вот один из методов:

select t.*
from t
order by cast(substring(t.weekendhours, 1, 8) as time) desc
fetch first 1 row only;

Конечно, эти запросы используют общие методы для многих баз данных.Логика может работать в вашей базе данных, но синтаксис может быть другим.

Примечание. Все это потому, что столбец weekendhours не работает.Он должен быть в двух столбцах, weekend_opentime и weekend_closetime.Тогда запрос будет тривиальным.

...