【问题标题】:SQL Select Upcoming BirthdaysSQL 选择即将到来的生日
【发布时间】:2010-09-10 03:46:56
【问题描述】:

我正在尝试编写一个存储过程来选择即将过生日的员工。

SELECT * FROM Employees WHERE Birthday > @Today AND Birthday < @Today + @NumDays

这不起作用,因为出生年份是生日的一部分,所以如果我的生日是“09-18-1983”,那么它不会介于“09-18-2008”和“09-25-2008”之间。

有没有办法忽略日期字段的年份部分而只比较月/日?

这将在每个星期一早上运行,以提醒经理即将到来的生日,因此它可能会跨越新的一年。

这是我最终创建的可行解决方案,感谢 Kogus。

SELECT * FROM Employees 
WHERE Cast(DATEDIFF(dd, birthdt, getDate()) / 365.25 as int)
    - Cast(DATEDIFF(dd, birthdt, futureDate) / 365.25 as int) 
<> 0

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    当前月份的生日

    SELECT * FROM tblMember m
    WHERE m.GDExpireDate != '' 
    AND CONVERT(CHAR(2),CONVERT(datetime, m.dob, 103), 101) = CONVERT(CHAR(2), GETDATE(), 101)    
    AND CONVERT(CHAR(2),CONVERT(datetime, m.dob, 103), 103) >= CONVERT(CHAR(2), GETDATE(), 103)
    

    【讨论】:

      【解决方案2】:

      从员工中选择出生日期、姓名 按案例排序 当转换(nvarchar(5),出生日期,101)>转换(nvarchar(5),GETDATE(),101)然后2 当转换(nvarchar(5),出生日期,101)

      【讨论】:

      • 请说明您的代码如何解决问题。请格式化您的代码。
      【解决方案3】:

      下面的查询将返回所有员工的下一个生日,是最短的查询。

      SELECT 
          Employee.DOB,
          DATEADD(
                      mm, 
                      (
                          (
                              (
                                  (
                                      DATEPART(yyyy, getdate())-DATEPART(yyyy, Employee.DOB )
                                  )
                                  +
                                  (
                                      1-
                                      (
                                          ((DATEPART(mm, Employee.DOB)*100)+DATEPART(dd, Employee.DOB))
                                          /
                                          ((DATEPART(mm, getdate())*100) + DATEPART(dd, getdate()))
                                      )
                                  )
                              )
                          *12
                          )
                      ), 
                      Employee.DOB
                  ) NextDOB
      FROM 
          Employee 
      ORDER BY 
          NextDOB ;
      

      以上查询将涵盖除当前日期外的所有下个月。

      【讨论】:

        【解决方案4】:

        SQLite3的解决方案:

        SELECT
            *, 
            strftime('%j', birthday) - strftime('%j', 'now') AS days_remaining
        FROM
            person
        WHERE :n_days >= CASE
            WHEN days_remaining >= 0 THEN days_remaining
            ELSE days_remaining + strftime('%j', strftime('%Y-12-31', 'now'))
            END
        ;
        

        除以 325.25 来获得年龄或将出生日期带到当年等的解决方案对我不起作用。 它的作用是计算这两天的增量(1-366)。如果今年还没有生日,您会自动获得正确的剩余天数,您可以进行比较。 如果生日已经过了,remaining_days 为负数,你可以通过仍然添加当年的总天数来得到正确的剩余天数。这也可以正确处理闰年,因为在这种情况下也会添加额外的一天(通过使用 dayOfYear(Dec 31.))

        【讨论】:

          【解决方案5】:

          您可以使用此查询来查询今天的生日

          select * 
          from tableName
          where DAY(convert(date,GETDATE(),105))=DAY(convert(date,DOB,105))
          and month(convert(date,GETDATE(),105))=month(convert(date,DOB,105))
          

          【讨论】:

            【解决方案6】:

            这里我们需要real和next来比较是否已经过去了

            CREATE FUNCTION dbo.FN_NEXT_BIRTHDAY(@BIRTHDAY DATE)
            RETURNS DATE
            AS
            BEGIN
                DECLARE @ACTUAL DATE = DATEADD(YEAR, DATEDIFF(YEAR, @BIRTHDAY , GETDATE()), @BIRTHDAY);
                DECLARE @NEXT DATE = DATEADD(YEAR, DATEDIFF(YEAR, @BIRTHDAY , GETDATE())+1, @BIRTHDAY);
            
                RETURN CASE WHEN @ACTUAL > GETDATE() THEN @ACTUAL 
                            ELSE @NEXT 
                            END;
            END;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-04-14
              • 1970-01-01
              • 2014-05-03
              • 1970-01-01
              • 1970-01-01
              • 2013-08-31
              • 2016-03-14
              • 1970-01-01
              相关资源
              最近更新 更多