#sql #string #oracle #datetime #where-clause
#sql #строка #Oracle #дата и время #where-предложение
Вопрос:
Select * from dual where between to_date(date,'YYYY-MM-DD') = '2020-10-01'
and to_date(date,'YYYY-MM-DD') 5
это правильный способ написания запроса?
1. формат даты — varchar2 2. требуемые данные между текущей датой и следующими 5 днями 3. сначала необходимо преобразовать в формат даты. 4. следующие 5 должны быть 5 в текущий день
Комментарии:
1. где что- то среднее…
2. Не храните даты в столбце varchar2, используйте правильный тип данных date!
3. имя столбца — «дата»,
4. Привет, Jarlh, столбец уже предопределен, нам нужно преобразовать это, но когда я использую (to_date и to_char ), я получаю сообщение об ошибке: полный год oracle должен быть между -4713 и 9999, а не быть 0
5. Затем у вас возникают проблемы с данными из-за неправильно введенной даты. Если вы используете Oracle 12.2 , вы можете обойти свои строки, которые должны представлять даты, но не с предложением on conversion error docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf /…
Ответ №1:
Вероятно, вы хотели написать:
where to_date(mydate, 'yyyy-mm-dd') between trunc(sysdate)
and trunc(sysdate) 5
Обоснование:
-
date
это зарезервированное слово; Я предполагаю, что это не фактическое имя вашего столбца, поэтому я использовал что-то другое; если это настоящее имя, то вам нужно заключить его в двойные кавычки ("date"
, или"DATE"
, или еще, в зависимости от того, как оно было определено изначально) -
mydate
это строка, поэтому вам нужно превратить ее в дату: для этого вы можете использоватьto_date()
-
затем вы сравниваете его с текущей датой без временной части:
trunc(sysdate)
и с той же датой через 5 дней
Обратите внимание, однако, что это было бы более эффективно выражено следующим образом:
where mydate between to_char(trunc(sysdate), 'yyyy-mm-dd')
and to_char(trunc(sysdate 5), 'yyyy-mm-dd')
Это позволяет избежать преобразования даты в столбце string и вместо этого преобразует границы интервала. Здесь возможно сравнение строк, поскольку формат строки, которую вы сохраняете, позволяет это (если бы она была сохранена, dd-mm-yyyy'
например, это было бы невозможно).
Позвольте мне, однако, настоятельно рекомендовать хранить ваши даты как date
s, а не как string. Вы всегда должны использовать правильный тип данных по многим причинам, таким как целостность и эффективность данных.
Комментарии:
1. Разве DATE не является зарезервированным словом в Oracle? en.wikipedia.org/wiki/SQL_reserved_words
2. @jarlh: да. Я сомневаюсь, что это фактическое имя столбца OP, но я добавил маркер, чтобы упомянуть об этом.
3. я получаю ошибку ORA-01841: (полный) год должен быть между -4713 и 9999, а не быть 0
4. @TulsiThakur: тогда у вас в столбце недопустимые даты. Если вы используете второе предложение в ответе, вы не получите эту ошибку ( но вы можете получить даты, которые находятся вне диапазона, хотя …).
5. «я получаю ошибку ORA-01841» Это потому, что ваш столбец «дата» неправильно введен и содержит неверные данные. в нем. Когда вы используете столбец данных символьного типа для хранения дат, ничто не мешает одной дате быть «2010-10-28», а следующей — «05-04-12», а следующей — «вот твой знак». Вы только что доказали, почему так важно использовать правильно введенные столбцы данных. В случае dates это означает, что столбец должен быть введен как ДАТА.