Может ли один скажите мне, как получить список работника, которые имеют свои дни рождения сегодня ....SQL запрос, чтобы проверить, если сегодня день рождения работника
Спасибо, Вишал
Может ли один скажите мне, как получить список работника, которые имеют свои дни рождения сегодня ....SQL запрос, чтобы проверить, если сегодня день рождения работника
Спасибо, Вишал
SELECT *
FROM Employees
WHERE DATEPART(d, DateOfBirth) = DATEPART(d, GETDATE())
AND DATEPART(m, DateOfBirth) = DATEPART(m, GETDATE())
Один комментарий, чтобы сделать на том, что это предполагает, что 'DateOfBirth' будет хранится в том же часовом поясе, что установленный на сервере SQL. Если 'DateOfBirth' будет храниться в UTC, тогда потребуется' GETUTCDATE() '. – rrrr
@ Dems Я проверил план выполнения в моей базе данных примеров и, по крайней мере, утверждать, что использовал индекс. –
@miikaL. - В лучшем случае он будет использовать сканирование. Это все еще полная проверка, а не поиск. – MatBailie
WHERE
месяц и день дня рождения сотрудника день и день (очевидно). Более конкретные инструкции потребуют большего ввода.
Вы можете сделать что-то вроде этого:
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())
afaik это также будет запутывать и индексировать в поле 'birthday'. – MatBailie
@Dems Я все время забываю, что :) –
В идеале немного больше информации о структуре источников данных могли бы помочь, но простой ответ обеспечивая ваши записи сотрудника есть ДОБ поле будет сравнивать день и месяц этого с текущей системной датой в предложении where вашего запроса.
Что-то по следующим направлениям:
select * from wherever
where
....
(
datepart(d, EmployeeDOB) = datepart(d, getdate()) and
datepart(m, EmployeeDOB) = datepart(m, getdate())
)
.....
Привет, очень много .... У меня это получилось .. :) –
@VishalAvhad - Обратите внимание, что этот параметр обфускает INDEX и заставит полностью сканировать таблицу. Если у вас большое количество записей, это будет значительными накладными расходами. – MatBailie
Хотя это гораздо более долго наматывается, это избежать необходимости сканировать всю таблицу в поисках спичек.
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))
Чтобы ответить на ваш вопрос прямо ... «Да» – SQLMason
@DanAndrews, не безоговорочно :) –