#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()
использовать английский язык, используя третий параметр, если хотите.