Извлечение даты в SQL

#sql #postgresql #date

Вопрос:

У меня есть дата выполнения столбца в формате 20210701 (ГГГГММДД), используя SQL, я хочу извлечь все даты, кроме 5-го числа определенного месяца ( как показано на рисунке ниже).

введите описание изображения здесь

Я использовал приведенный ниже код:

 SELECT Due_Date_Key
FROM Table
WHERE Due_Date_Key <>20210705
 

Однако ошибка в приведенном выше коде заключается в том, что он будет исключать только июль месяц, но не для других месяцев.
Как извлечь даты, кроме 5-й, из всего столбца.

Помощь была бы очень признательна.

Обратите внимание, что столбец DUE_DATE_KEY является числовым.

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

1. вы могли бы использовать NOT IN вместо <>

2. @Abra столбец является числовым

3. @MarEll, я думаю, что это все равно будет фильтровать месяц, который мы вводим, верно? например, «ВЫБЕРИТЕ ключ Due_Date_Key ИЗ таблицы, ГДЕ ключа Due_Date_Key НЕТ В 20210705» Пожалуйста, поправьте меня, если я ошибаюсь.

4. Спасибо @Abra. Можно ли извлечь последние две цифры, а затем отфильтровать число, кроме 05, будет ли работать приведенный ниже код ? « ВЫБЕРИТЕ *, СПРАВА (due_date_key,2) В КАЧЕСТВЕ дня ИЗ таблицы, ГДЕ день <> 05«

Ответ №1:

Более простым способом было бы преобразовать строку в дату, а затем проверить, не равен ли день 5

 SELECT * FROM Table 
WHERE DATE_PART('day', to_date(cast(DUE_DATE_KEY as varchar), 'YYYYMMDD')) != 5
 

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

1. Привет @SagarPanchal Я попробовал приведенный выше код, однако я получаю следующую ошибку: «Ни одна функция не соответствует заданному имени и типам аргументов. Возможно, вам потребуется добавить явные приведения типов.»—. Не знаю, как поступить примерно так же, любые входные данные помогут!!

2. Я попробовал приведенный ниже код: ` выберите*, СПРАВА(due_date_key, 2) КАК день ИЗ T,ГДЕ День > 5« Я получаю сообщение об ошибке » Ни одна функция не соответствует заданному имени и типам аргументов. Возможно, вам потребуется добавить явные приведения типов.» Не знаю, как поступить дальше

3. @Sid Какую версию Postgres вы используете? ПРАВИЛЬНАЯ функция доступна после версии 9.3. Кроме того, почему вы делаете день > 5, это синтаксически неправильно, потому что у вас нет «Дня» в качестве столбца, и даже если у вас есть, вы пропустите все дни до 5-го, вы можете использовать следующий SQL, чтобы получить день в виде отдельного столбца ` » ВЫБЕРИТЕ таблицу.*, DATE_PART («день», to_date(DUE_DATE_KEY, ` YYYYMMDD’)) ИЗ таблицы, ГДЕ DATE_PART («день», to_date(DUE_DATE_KEY, ‘YYYYMMDD’))! = 5 «

4. спасибо за вклад, да, я хотел привести даты, отличные от 5-го. Я попробовал приведенный выше код. Я получаю ошибку, я создал фиктивную таблицу и выполнил предложенный запрос. Пожалуйста, найдите ссылку на выданную ошибку. Ссылка

5. @Sid Вы видите ошибку, потому что DUE_DATE_KEY был int(8). Его нужно преобразовать в строку. Проверьте эту обновленную ссылку

Ответ №2:

Используя оператор по модулю, чтобы определить, являются ли последние две цифры ключа DUE_DATE_KEY 05.

 select * from T where DUE_DATE_KEY % 100 <> 5
 

Используя ваши примерные данные, приведенный выше запрос возвращает следующее:

 due_date_key
20210701
20210708
20210903
 

Обратитесь к этой скрипке db