SQL от дд-мм-гггг до гггг-мм-дд - PullRequest
3 голосов
/ 29 октября 2019

Я работаю над заданием SQL в моей школе. Для меня есть проблема с DATE. Задан запрос.

INSERT INTO myTable (t_id, Birthdate) VALUES (1, TO_DATE('01-Jun-2005','dd-mm-yyyy'));
INSERT INTO myTable (t_id, Birthdate) VALUES (2, TO_DATE('04-Apr-2002','dd-mm-yyyy'));
INSERT INTO myTable (t_id, Birthdate) VALUES (3, TO_DATE('21-Mar-2004','dd-mm-yyyy'));
INSERT INTO myTable (t_id, Birthdate) VALUES (4, TO_DATE('05-Dec-2002','dd-mm-yyyy'));
INSERT INTO myTable (t_id, Birthdate) VALUES (5, TO_DATE('13-Sep-2003','dd-mm-yyyy'));

Я хочу получить t_id, где YEAR - 2002. Я попробовал следующий код,

SELECT t_id FROM myTable WHERE YEAR(Birthdate) = '2002';

Но он дает мне синтаксическую ошибку. Я искал это в интернете. он говорит, что ГОД работает только с форматом «гггг-мм-дд». Но в моем задании вопрос имеет формат «дд-мм-гггг». Как я могу ответить на мой вопрос? Пожалуйста, помогите мне выбраться из этого ада.

Ответы [ 3 ]

4 голосов
/ 29 октября 2019

year() поддерживается не во всех СУБД (в частности, Oracle или Postgres, которые вы, похоже, используете, не поддерживают его). Вместо этого используйте стандартную функцию sql extract():

extract(year from Birthdate)

Это работает, если Birthdate имеет тип данных date. Если это строка в каком-либо формате, вам нужно сначала преобразовать ее в дату, используя to_date() в Oracle, например:

extract(year from to_date(Birthdate, 'yyyy-mm-dd'))

В других СУБД есть разные функции для преобразования строк в даты.

Наконец, обратите внимание, что более эффективно избегать использования функций при фильтрации, поскольку это приводит к потере индекса для фильтруемого столбца. Обычно вы хотите делать сравнения по всей дате, поэтому:

Birthdate >= to_date('2002-01-01', 'yyyy-mm-dd') and
Birthdate < to_date('2003-01-01', 'yyyy-mm-dd')

Примечание: дескриптор формата для '01-Jun-2005' будет 'dd-mon-yyyy', а не 'dd-mm-yyyy'.

2 голосов
/ 29 октября 2019

Вы можете использовать:


SELECT t_id FROM myTable WHERE DATEPART(YEAR, Birthdate) = '2002'

1 голос
/ 29 октября 2019

:)

Это работает для меня:

ВЫБРАТЬ t_id ОТ ВАШЕЙ_ЛАТЫ WHERE DATE_FORMAT (Дата рождения, '% Y') = 2002

...