#sql #oracle #date
#sql #Oracle #Дата
Вопрос:
Я хочу закодировать функцию, которая принимает год в качестве параметра и возвращает человека, родившегося в этом году. Но мой формат таблицы людей, такой как 1993-01-06 00:00:00 итак, как я могу сравнить дату и вернуть отфильтрованного человека в sql?
Комментарии:
1. Каков тип данных этой «даты» в вашей таблице? Если это что-то другое, кроме ДАТЫ, то у вас серьезный сбой в дизайне, который следует исправить. Два человека показали вам, как с этим справиться, если это не ДАТА, но это не следует понимать как одобрение этого дизайна. Если это не ДАТА, то у вас есть нулевая гарантия формата и того, как его интерпретировать.
Ответ №1:
Предполагая, что в вашей таблице есть столбец с DATE
типом данных, тогда:
SELECT *
FROM table_name
WHERE date_column >= TO_DATE( :year || '-01-01', 'YYYY-MM-DD' )
AND date_column < TO_DATE( ( :year 1 ) || '-01-01', 'YYYY-MM-DD' );
(Используйте диапазон дат, а не используйте EXTRACT
или TO_CHAR
в столбце даты, поскольку это позволяет Oracle использовать индекс в столбце даты.)
Если ваш столбец имеет строковый тип данных с 4-значным годом:
SELECT *
FROM table_name
WHERE string_column LIKE :year || '-%'
(Не просто объединяйте %
, поскольку, если у вас есть исторические годы, попытка сопоставить год 200
также будет соответствовать году 2000
.)
Ответ №2:
Если тип данных столбца является строкой, то вы можете использовать:
where col like :year || '%'
Если типом данных является дата или временная метка, то вы можете использовать:
where extract(year from col) = :year