SQL Server 2005, Расчет предстоящих дней рождения от даты рождения - PullRequest
5 голосов
/ 20 сентября 2010

Этот уже давно меня раздражает.Недавно, когда я пересматривал некоторый код, который я написал для клиента, несколько лет назад, мне было интересно, есть ли более элегантное решение проблемы.

Клиент хранит всю информацию своих клиентов, включая дату рождения (поле даты и времени))

Они запускают выписку каждый понедельник, которая запрашивает любого клиента, чей день рождения выпадет в течение следующей недели.

Т.е., если выписка была запущена в понедельник 1 января, клиенты, чей день рождения упал между (ивключая) Понедельник 8 января -> воскресенье 14 января будет получено.

Мое решение состояло в том, чтобы использовать функцию Datepart (dy) и вычислять все предстоящие дни рождения на основе даты рождения клиентов, преобразованной в день года, добавляянекоторая логика для включения выдержки в конце года.Проблема заключалась в том, что использование Дня года отбрасывает результаты на 1 день, если клиент родился в високосный год и / или выписка выполняется в високосный год после 29 февраля, поэтому мне снова пришлось добавить больше логикипоэтому процедура вернула ожидаемые результаты.

Это казалось слишком сложным для простой задачи. Для простоты, скажем, таблица 'customer' содержит 4 поля: имя, фамилия, dob и адрес.

Любые предложения о том, как упростить это, были бы очень благодарны

Уэс

Ответы [ 5 ]

4 голосов
/ 20 сентября 2010

Хотелось бы что-нибудь подобное для вас?

select * from Customers c 
where dateadd(year, 1900-year(dob), dob) 
    between dateadd(year, 1900-year(getdate()), getdate())
    and dateadd(year, 1900-year(getdate()), getdate())+7
3 голосов
/ 20 сентября 2010

Почему бы не использовать DATEPART (wk) в день рождения этого года?

SET DATEFIRST 1  -- Set first day of week to monday
SELECT * FROM customer
WHERE DATEPART(wk, DATEADD(yy, DATEPART(yy, GETDATE()) - DATEPART(yy, customer.dob), customer.dob)) = DATEPART(wk, GETDATE()) + 1

Он выбирает всех клиентов, чей номер дня рождения больше, чем текущий номер недели.

2 голосов
/ 20 сентября 2010

Я думаю DATEADD должен делать правильные вещи.

1 голос
/ 18 октября 2012

Пожалуйста, попробуйте этот.

SELECT TOP 10 BirthDate, FirstName
FROM Customers
WHERE DATEPART(mm,BirthDate) >= DATEPART(mm,GETDATE())
AND DATEPART(day,BirthDate) >= DATEPART(day,getdate())
OR DATEPART(mm,BirthDate) > DATEPART(mm,getdate())
ORDER BY DatePart(mm,BirthDate),DatePart(day,BirthDate)

этот запрос получит предстоящие дни рождения, включая саму сегодня

1 голос
/ 14 октября 2011
YEAR(GETDATE() - dbo.Patients.Dob) - 1900

Я могу с уверенностью предположить, что у вас никогда не будет клиентов, родившихся до 1900

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...