生日SQL函数

时间:2018-07-12 18:06:16

标签: sql sql-server tsql datepart

我正在尝试创建一个名为“生日”的表达式以在给定的过滤器中使用,该过滤器显示“生日等于@today”以返回给定日期的任何生日。获取生日的唯一方法是基于“出生日期”字段。显然,DOB年与当前年不同。我需要帮助来创建一个可以识别某人生日而不需要考虑年份的SQL表达式。

2 个答案:

答案 0 :(得分:2)

这应该可以解决问题:

DECLARE @THEDAY INT = 1
DECLARE @THEMONTH INT = 1

IF OBJECT_ID('BDAY_TABLE') IS NOT NULL
    DROP TABLE BDAY_TABLE

CREATE TABLE BDAY_TABLE (ID INT,
            BDAY DATETIME)

INSERT INTO BDAY_TABLE (ID, BDAY)
VALUES (1, '1/1/2000'),
(2, '2/10/2000'),
(2, '1/1/2010'),
(2, '10/30/2005')

SELECT * FROM BDAY_TABLE

SELECT * FROM BDAY_TABLE 
WHERE DATEPART(DAY, BDAY) = @THEDAY
AND DATEPART(MONTH, BDAY) = @THEMONTH

结果:

1   2000-01-01 00:00:00.000
2   2010-01-01 00:00:00.000

请注意使用DATEPART,这样我们就不会真正在意年份。

答案 1 :(得分:0)

您可以使用DATEADDYEAR函数来计算给定年份的生日。假设您有一个保存当前日期的变量@TODAY,则可以将其用作WHERE子句,以仅获取那些今天庆祝生日的人:

WHERE DATEADD(year, YEAR(@TODAY)-YEAR(DOB), DOB) = @TODAY

这还将克服the年问题,即这样的人将在3月1日非non年返回。

但是最有可能您希望在生日之前得到通知,比方说提前2周,因此我建议确实计算下一个生日,以便能够使用该生日的任何条件,例如:

DECLARE @TODAY datetime = DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0);

SELECT LastName, FirstName, Email, DOB, Birthday, YEAR(Birthday)-YEAR(DOB) AS becoming
FROM People
  CROSS APPLY ( VALUES (
    CASE WHEN DATEADD(year, YEAR(@TODAY)-YEAR(DOB), DOB) < @TODAY
      THEN DATEADD(year, 1 + YEAR(@TODAY)-YEAR(DOB), DOB)
      ELSE DATEADD(year, YEAR(@TODAY)-YEAR(DOB), DOB)
    END)
  ) bd (Birthday)
WHERE Birthday <= DATEADD(day, 14, @TODAY);