2012-01-10 2 views
3

Может ли один скажите мне, как получить список работника, которые имеют свои дни рождения сегодня ....SQL запрос, чтобы проверить, если сегодня день рождения работника

Спасибо, Вишал

+7

Чтобы ответить на ваш вопрос прямо ... «Да» – SQLMason

+0

@DanAndrews, не безоговорочно :) –

ответ

16
SELECT * 
FROM Employees 
WHERE DATEPART(d, DateOfBirth) = DATEPART(d, GETDATE()) 
    AND DATEPART(m, DateOfBirth) = DATEPART(m, GETDATE()) 
+3

Один комментарий, чтобы сделать на том, что это предполагает, что 'DateOfBirth' будет хранится в том же часовом поясе, что установленный на сервере SQL. Если 'DateOfBirth' будет храниться в UTC, тогда потребуется' GETUTCDATE() '. – rrrr

+0

@ Dems Я проверил план выполнения в моей базе данных примеров и, по крайней мере, утверждать, что использовал индекс. –

+0

@miikaL. - В лучшем случае он будет использовать сканирование. Это все еще полная проверка, а не поиск. – MatBailie

0

WHERE месяц и день дня рождения сотрудника день и день (очевидно). Более конкретные инструкции потребуют большего ввода.

0

Вы можете сделать что-то вроде этого:

select e.name from employeeTable e 
where right(e.birthday) = right(convert(varchar(8), getdate(), 112), 4) 

или

select e.name from employeeTable e 
where datepart(d, e.birthday) = datepart(d, getdate()) 
    and datepart(m, e.birthday) = datepart(m, getdate()) 
+1

afaik это также будет запутывать и индексировать в поле 'birthday'. – MatBailie

+0

@Dems Я все время забываю, что :) –

1

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

Что-то по следующим направлениям:

select * from wherever 
where 
.... 
(
    datepart(d, EmployeeDOB) = datepart(d, getdate()) and 
    datepart(m, EmployeeDOB) = datepart(m, getdate()) 
) 
..... 
+0

Привет, очень много .... У меня это получилось .. :) –

+1

@VishalAvhad - Обратите внимание, что этот параметр обфускает INDEX и заставит полностью сканировать таблицу. Если у вас большое количество записей, это будет значительными накладными расходами. – MatBailie

0

Хотя это гораздо более долго наматывается, это избежать необходимости сканировать всю таблицу в поисках спичек.

WITH 
    a_century AS 
(
    SELECT 1 AS year 
    UNION ALL 
    SELECT year * 2 + 0 AS year FROM a_century WHERE year < 64 
    UNION ALL 
    SELECT year * 2 + 1 AS year FROM a_century WHERE year < 64 
) 
SELECT 
    * 
FROM 
    yourTable 
INNER JOIN 
    a_century 
    ON yourTable.birthday = DATEADD(year, -a_century.year, DATEADD(day, DATEDIFF(day, 0, getDate()), 0)) 
Смежные вопросы