выборка записей между «текущей датой» и следующими 5 днями (будущей датой) в oracle

#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 это означает, что столбец должен быть введен как ДАТА.