Как вернуть день рождения из оператора SQL, учитывая возраст человека - PullRequest
3 голосов
/ 25 февраля 2012

Я пытаюсь создать фильтр в ASP.net, где пользователь может выбрать определенный возраст, а оператор SQL должен вернуть всех пользователей, которые в настоящее время имеют этот возраст, на основе «DOB» (дата рождения)field.

Итак, например, допустим, что у меня есть переменная age, которая в настоящее время содержит 23. У меня есть поле в базе данных с именем 'DOB', типа 'date'.Как написать оператор SQL для возврата всех записей, чья дата рождения указывает, что им 23?Формат DOB: ГГГГ-ММ-ДД.

Спасибо

Ответы [ 5 ]

2 голосов
/ 25 февраля 2012

Я предполагаю, что и столбец базы данных, и переменная age содержат данные даты / времени, а не строки.Я также собираюсь предположить, что значения [DOB] гарантированно не содержат компонент времени.

В вашей спецификации отсутствует один элемент данных: контрольная дата.Другими словами, учитывая 23 года и кучу дней рождения, вы хотите знать, какие люди 23 на данную дату .Вы можете предположить, что это будет текущая дата, но здесь мы обобщим ее на переменную.

Родившимся 24 февраля 1989 года сегодня 23 года;кто родился позже, тот моложе.Те, кто родился 24 февраля 1988 года или ранее, сегодня 24 года или старше.Таким образом, желаемый диапазон составляет от 25 февраля 1988 года до 24 февраля 1989 года.

DECLARE @age int
DECLARE @referenceDate date
DECLARE @rangeEnd date
DECLARE @rangeBegin date

SELECT @age = 23
SELECT @referenceDate = GETDATE()
            --2012-02-24
SELECT @rangeBegin = DATEADD(day, 1, DATEADD(year, -@age-1, @referenceDate))
            --1988-02-25
SELECT @rangeEnd = DATEADD(year, -@age, @referenceDate)
            --1989-02-24

-- EDIT: this expression is incorrect; thanks to ypercube for catching the bug
-- SELECT @rangeBegin = DATEADD(day, 1, DATEADD(year, -1, @rangeEnd))

SELECT * FROM <table> 
WHERE DOB BETWEEN @rangeBegin AND @rangeEnd
2 голосов
/ 25 февраля 2012

Еще один способ добиться этого.

DECLARE @age int
DECLARE @dob1 date
DECLARE @dob2 date
SELECT @age = 23
SELECT @dob1 = DATEADD(year, -@age, getdate())
SELECT @dob2 = DATEADD(year, 1, @dob1)

SELECT * FROM <table> 
WHERE DOB BETWEEN @dob1 AND @dob2
2 голосов
/ 25 февраля 2012
WHERE YEAR(GETDATE() - DATEPART(dy, DOB) + 1) - YEAR(DOB) = 37

просто измените 37 на 23 или лучше, но используйте переменную

Вот пример, который вы можете запустить

CREATE TABLE #test(DOB DATETIME)

INSERT #test VALUES('19701127')
INSERT #test VALUES('19741127')
INSERT #test VALUES('19740227')
INSERT #test VALUES('19761127')
INSERT #test VALUES('19761127')
INSERT #test VALUES('19701127')


SELECT * FROM #test
WHERE YEAR(GETDATE() - DATEPART(dy, DOB) + 1) - YEAR(DOB) = 37

1974-11-27 00:00:00.000
1974-02-27 00:00:00.000

Вы также можете использовать это более замысловатым ГДЕпункт

 SELECT *
        FROM #test
        WHERE DATEDIFF(YEAR, DOB, GETDATE()) -
        CASE WHEN DATEPART(mm,DOB) > DATEPART(mm,GETDATE())
       OR (DATEPART(mm,DOB) = DATEPART(mm,GETDATE())
       AND DATEPART(dd,DOB) > DATEPART(dd,GETDATE()))
        THEN 1 ELSE 0 END = 37
0 голосов
/ 25 февраля 2012

Те, кто родился в ту же дату, что и сегодня, ровно @age лет назад:

WHERE dob = DATEADD( year, - @age, GETDATE() ) 
0 голосов
/ 25 февраля 2012

Если поле DOB является полем даты, вы можете выполнить сравнение дат, чтобы получить то, что вы хотите.

SELECT user, DOB FROM yourtable 
WHERE MONTH(CURDATE())=MONTH(DOB) AND 
DAY(CURDATE())=DAY(DOB) AND YEAR(CURDATE())-YEAR(DOB)=23;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...