2012-01-10 63 views

回答

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 2012-01-10 13:29:19

+0

@Dems我检查了我的示例数据库中的执行计划,它至少声称使用索引。 – 2012-01-10 13:38:28

+0

@miikaL。 - 它将最好使用扫描。它仍然是一个完整的扫描,而不是一个寻求。 – MatBailie 2012-01-10 13:44:36

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这也将在生日字段上进行混淆和索引。 – MatBailie 2012-01-10 13:33:52

+0

@Dems我一直忘记:) – 2012-01-10 13:35:53

1

理想上的数据源,将有助于结构更多的信息,但一个简单的答案,提供您的员工记录有一个DOB字段将在查询的where子句中将此日期和月份与当前系统日期进行比较。

东西大致如下:

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

嘿安迪,thnx很多.... 我得到它的工作.. :) – 2012-01-10 13:41:12

+1

@VishalAvhad - 请注意,此选项混淆了INDEX,并将强制进行全表扫描。如果你有大量的记录,这将是一个很大的开销。 – MatBailie 2012-01-10 13:45:46

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))