Oracle SQL: выберите для дня недели и преобразования столбца в дату

#sql #oracle-sqldeveloper

#sql #oracle-sqldeveloper

Вопрос:

У меня есть база данных со столбцом (с типом данных VARCHAR20)

Создано
2020-01-01T20:30:20.207Z
2020-01-04T23:10:00.242Z

В конце я хочу иметь возможность фильтровать по определенному дню недели. Мой первый шаг для этого — применить

 SELECT *
FROM mydatabase
WHERE TO_DATE(CREATED, 'YYYY-MM-DD"T"HH24:MI:SS.FFF"Z"') BETWEEN TO_DATE ('2020-01-02T10:39:00.000Z', 'YYYY-MM-DD"T"HH24:MI:SS.FFF"Z"') AND TO_DATE('2020-01-03T15:39:00.000Z', 'YYYY-MM-DD"T"HH24:MI:SS.FFF"Z"');
 

чтобы увидеть, работает ли преобразование, соответствующее моему формату ISO8601. К сожалению, я получаю сообщение об ошибке «ORA-01821 — «формат даты не распознан»». Было бы здорово, если бы кто-нибудь мог сказать мне, как выполнить мою задачу фильтрации в соответствии с определенным днем недели, и если я на правильном пути.

Всего наилучшего.

Комментарии:

1. Мораль истории заключается в том, чтобы хранить ваши данные в правильном формате

Ответ №1:

Я бы просто сделал:

 where to_char(to_date(substr(created, 1, 10), 'YYYY-MM-DD'), 'Dy') = 'Mon'
 

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

 select to_char(to_date(substr(created, 1, 10), 'YYYY-MM-DD'), 'Dy') = 'Mon'
 

Или используйте родной язык базы данных.

Это преобразует первые десять символов в дату, а затем преобразует ее в день недели.

Комментарии:

1. Отличный ответ, работает, за исключением «Mon», который в моем случае должен быть «Mo» (зависит от языка? Если да, как я могу установить его на английский?). И второй вопрос: можно ли применить метод, который вы использовали (с разными смещениями для подстроки) для запроса диапазона времени (т. Е. Между 14:00 и 15:00)?

2. @kallikles … Очевидно, что сравнение должно быть с любым языком, который вы предпочитаете. Вы можете принудительно to_char() использовать английский язык, используя третий параметр, если хотите.