28

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

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
4

36 回答 36

39

注意:我已经对此进行了编辑以修复我认为是一个重大错误。当前发布的版本对我有用。

这应该在您修改字段和表名称以对应于您的数据库后工作。

SELECT 
  BRTHDATE AS BIRTHDAY
 ,FLOOR(DATEDIFF(dd,EMP.BRTHDATE,GETDATE()) / 365.25) AS AGE_NOW
 ,FLOOR(DATEDIFF(dd,EMP.BRTHDATE,GETDATE()+7) / 365.25) AS AGE_ONE_WEEK_FROM_NOW
FROM 
  "Database name".dbo.EMPLOYEES EMP
WHERE 1 = (FLOOR(DATEDIFF(dd,EMP.BRTHDATE,GETDATE()+7) / 365.25))
          -
          (FLOOR(DATEDIFF(dd,EMP.BRTHDATE,GETDATE()) / 365.25))

基本上,它获取从他们生日到现在的天数,并将其除以 365(以避免直接转换为年份时出现的舍入问题)。

然后它得到从他们生日到一周后的天数,然后除以 365 得到他们一周后的年龄。

如果他们的生日在一周内,那么这两个值之间的差将为 1。因此它会返回所有这些记录。

于 2008-09-17T14:25:07.297 回答
17

如果有人仍在寻找MySQL中的解决方案(命令略有不同),查询如下:

SELECT
 name,birthday,
 FLOOR(DATEDIFF(DATE(NOW()),birthday) / 365.25) AS age_now,
 FLOOR(DATEDIFF(DATE_ADD(DATE(NOW()),INTERVAL 30 DAY),birthday) / 365.25) AS age_future

FROM user

WHERE 1 = (FLOOR(DATEDIFF(DATE_ADD(DATE(NOW()),INTERVAL 30 DAY),birthday) / 365.25)) - (FLOOR(DATEDIFF(DATE(NOW()),birthday) / 365.25))

ORDER BY MONTH(birthday),DAY(birthday)
于 2011-04-20T15:27:51.977 回答
11

datediff 和 dateadd 的最佳使用。没有四舍五入,没有近似值,没有 2 月 29 日的错误,只有日期函数

  1. ageOfThePerson = DATEDIFF(yyyy,dateOfBirth, GETDATE())

  2. dateOfNextBirthday = DATEADD(yyyy,ageOfThePerson + 1, dateOfBirth)

  3. daysBeforeBirthday = DATEDIFF(d,GETDATE(), dateofNextBirthday)

感谢@Gustavo Cardoso,人的年龄的新定义

  1. ageOfThePerson = FLOOR(DATEDIFF(d,dateOfBirth, GETDATE())/365.25)
于 2008-09-17T15:12:50.817 回答
3

喜欢@strelc 的方法,但他的 sql 有点不对劲。这是一个运行良好且易于使用的更新版本:

SELECT * FROM User 
WHERE (DATEDIFF(dd, getdate(), DATEADD(yyyy, 
    DATEDIFF(yyyy, birthdate, getdate()) + 1, birthdate)) + 1) % 366 <= <number of days>

编辑 10/2017:添加一天结束

于 2012-05-25T21:12:02.510 回答
2

您可以使用该DAYOFYEAR功能,但要在 12 月查找 1 月生日时要小心。只要您要查找的日期范围不跨越新年,我认为您会没事的。

于 2008-09-17T14:05:14.537 回答
2

抱歉,没有看到中和这一年的要求。

select * from Employees
where DATEADD (year, DatePart(year, getdate()) - DatePart(year, Birthday), Birthday)
      between convert(datetime, getdate(), 101) 
              and convert(datetime, DateAdd(day, 5, getdate()), 101)

这应该有效。

于 2008-09-17T14:14:40.787 回答
2

我的猜测是迟早使用“365.25”会失败。

因此,我使用“365.25”测试了工作解决方案,并且它不会为每种情况返回相同数量的行。这里有一个例子:

http://sqlfiddle.com/#!3/94c3ce/7

使用 2016 年和 2116 年进行测试,您会看到不同之处。我只能发布一个链接,但将 de /7 更改为 /8 以查看两个查询。(/10 和 /11 为第一个答案)

所以,我建议这个另一个查询,其中点是从开始日期确定下一个生日,然后比较它是否在我感兴趣的范围内。

SELECT * FROM Employees 
WHERE 
CASE WHEN (DATEADD(yyyy,DATEDIFF(yyyy, birthdt, @fromDate),birthdt) < @fromDate )
THEN DATEADD(yyyy,DATEDIFF(yyyy, birthdt, @fromDate)+1,birthdt)
ELSE DATEADD(yyyy,DATEDIFF(yyyy, birthdt, @fromDate),birthdt) END
BETWEEN @fromDate AND @toDate
于 2016-02-01T17:57:28.057 回答
1

这是 MS SQL Server 的解决方案:它返回 30 天内生日的员工。

SELECT * FROM rojstni_dnevi
  WHERE (DATEDIFF   (dd, 
                    getdate(), 
                    DATEADD (   yyyy, 
                                DATEDIFF(yyyy, rDan, getdate()),
                                rDan)
    nex             )
        +365) % 365 < 30
于 2010-11-10T09:12:55.340 回答
1

我找到了解决方案。这可能会节省某人的宝贵时间。

 select EmployeeID,DOB,dates.date  from emp_tb_eob_employeepersonal 
 cross join dbo.GetDays(Getdate(),Getdate()+7) as dates where weekofmonthnumber>0
 and month(dates.date)=month(DOB) and day(dates.date)=day(DOB)



GO
/****** Object:  UserDefinedFunction [dbo].[GetDays]    Script Date: 11/30/2011 13:19:17 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--SELECT [dbo].[GetDays] ('02/01/2011','02/28/2011')

ALTER FUNCTION [dbo].[GetDays](@startDate datetime, @endDate datetime)
RETURNS @retValue TABLE
(Days int ,Date datetime, WeekOfMonthNumber int, WeekOfMonthDescription varchar(10), DayName varchar(10))
AS
BEGIN
    DECLARE @nextDay int
    DECLARE @nextDate datetime 
    DECLARE @WeekOfMonthNum int 
    DECLARE @WeekOfMonthDes varchar(10) 
    DECLARE @DayName varchar(10) 
    SELECT @nextDate = @startDate, @WeekOfMonthNum = DATEDIFF(week, DATEADD(MONTH, DATEDIFF(MONTH,0,@startDate),0),@startDate) + 1, 
    @WeekOfMonthDes = CASE @WeekOfMonthNum 
        WHEN '1' THEN 'First' 
        WHEN '2' THEN 'Second' 
        WHEN '3' THEN 'Third' 
        WHEN '4' THEN 'Fourth' 
        WHEN '5' THEN 'Fifth' 
        WHEN '6' THEN 'Sixth' 
        END, 
    @DayName 
    = DATENAME(weekday, @startDate)
SET @nextDay=1
WHILE @nextDate <= @endDate 
BEGIN 
    INSERT INTO @retValue values (@nextDay,@nextDate, @WeekOfMonthNum, @WeekOfMonthDes, @DayName) 
    SELECT @nextDay=@nextDay + 1 
SELECT @nextDate = DATEADD(day,1,@nextDate), 
    @WeekOfMonthNum 
    = DATEDIFF(week, DATEADD(MONTH, DATEDIFF(MONTH,0, @nextDate),0), @nextDate) + 1, 
    @WeekOfMonthDes 
    = CASE @WeekOfMonthNum 
    WHEN '1' THEN 'First' 
    WHEN '2' THEN 'Second' 
    WHEN '3' THEN 'Third' 
    WHEN '4' THEN 'Fourth' 
    WHEN '5' THEN 'Fifth' 
    WHEN '6' THEN 'Sixth' 
    END, 
    @DayName 
    = DATENAME(weekday, @nextDate) 
    CONTINUE 
END 

WHILE(@nextDay <=31)
BEGIN


    INSERT INTO @retValue values (@nextDay,@nextDate, 0, '', '') 
    SELECT @nextDay=@nextDay + 1

END

    RETURN
END

与日期进行交叉连接并检查月份和日期的比较。

于 2011-11-30T07:54:22.327 回答
1

不到一个月: 

SELECT * FROM people WHERE MOD( DATEDIFF( CURDATE( ) , `date_birth`) /30, 12 ) <1 and (((month(`date_birth`)) = (month(curdate())) and (day(`date_birth`)) > (day (curdate() ))) or ((month(`date_birth`)) > (month(curdate())) and (day(`date_birth`)) < (day (curdate() ))))
于 2014-11-21T01:58:04.857 回答
0

您可以使用DATE_FORMAT提取生日日期的日期和月份部分。

编辑:对不起,我没有看到他没有使用 MySQL。

于 2008-09-17T14:01:31.317 回答
0

假设这是 T-SQL,使用 DATEPART 分别比较月份和日期。

http://msdn.microsoft.com/en-us/library/ms174420.aspx

或者,从每个人的生日中减去当年的 1 月 1 日,然后使用 1900 年(或您的纪元年)进行比较。

于 2008-09-17T14:07:13.207 回答
0

这些解决方案中的大多数都很接近,但您必须记住一些额外的场景。在使用生日和滑动比例时,您必须能够处理到下个月的过渡。

例如,Stephens 示例非常适用于每月最后 4 天的生日。那么你有一个逻辑错误,因为如果今天是 29 日,有效日期将是:29、30,然后是下个月的 1、2、3,所以你也必须为此设置条件。

另一种方法是从生日字段中解析日期,并在当前年份中进行细分,然后进行标准范围比较。

于 2008-09-17T14:08:31.610 回答
0

另一个想法:将他们的全年年龄添加到他们的生日(或者如果他们的生日还没有发生,则再添加一个,然后像上面那样进行比较。使用 DATEPART 和 DATEADD 来做到这一点。

http://msdn.microsoft.com/en-us/library/ms186819.aspx

跨越一年的范围的边缘情况必须具有特殊代码。

额外提示:考虑使用 BETWEEN...AND 而不是重复生日操作数。

于 2008-09-17T14:13:41.333 回答
0

这应该工作...

DECLARE @endDate DATETIME
DECLARE @today DATETIME

SELECT @endDate = getDate()+6, @today = getDate()

SELECT * FROM Employees 
    WHERE 
    (DATEPART (month, birthday) >= DATEPART (month, @today)
        AND DATEPART (day, birthday) >= DATEPART (day, @today))
    AND
    (DATEPART (month, birthday) < DATEPART (month, @endDate)
        AND DATEPART (day, birthday) < DATEPART (day, @endDate))
于 2008-09-17T14:15:09.350 回答
0

几年前,我在大学项目中遇到了同样的问题。我通过将年份和日期(MM:DD)分成两个单独的列来回应(以一种相当狡猾的方式)。在此之前,我的项目伙伴只是简单地获取所有日期并以编程方式处理它们。我们改变了它,因为它效率太低 - 并不是我的解决方案更优雅。此外,它可能无法在多个应用程序使用了一段时间的数据库中进行。

于 2008-09-17T14:28:20.690 回答
0

试试这个:

SELECT * FROM Employees
WHERE DATEADD(yyyy, DATEPART(yyyy, @Today)-DATEPART(yyyy, Birthday), Birthday) > @Today 
AND DATEADD(yyyy, DATEPART(yyyy, @Today)-DATEPART(yyyy, Birthday), Birthday) < DATEADD(dd, @NumDays, @Today)
于 2008-09-17T14:39:11.523 回答
0

坚果!在我开始考虑这个问题和我回来回答之间的一个很好的解决方案。:)

我想出了:

select  (365 + datediff(d,getdate(),cast(cast(datepart(yy,getdate()) as varchar(4)) + '-' + cast(datepart(m,birthdt) as varchar(2)) + '-' + cast(datepart(d,birthdt) as varchar(2)) as datetime))) % 365
from    employees
where   (365 + datediff(d,getdate(),cast(cast(datepart(yy,getdate()) as varchar(4)) + '-' + cast(datepart(m,birthdt) as varchar(2)) + '-' + cast(datepart(d,birthdt) as varchar(2)) as datetime))) % 365 < @NumDays

您不需要将 getdate() 转换为日期时间,对吗?

于 2008-09-17T15:32:06.700 回答
0

即将到来的员工生日 - Sqlserver

DECLARE @sam TABLE
(
    EmployeeIDs     int,
    dob         datetime
)
INSERT INTO @sam (dob, EmployeeIDs)
SELECT DOBirth, EmployeeID FROM Employee

SELECT *
FROM
(
    SELECT *, bd_this_year = DATEADD(YEAR, DATEPART(YEAR, GETDATE()) - DATEPART(YEAR, dob), dob)
    FROM @sam s
) d
WHERE d.bd_this_year > DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)
AND d.bd_this_year <= DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 3)
于 2008-12-01T07:40:17.253 回答
0

我希望这对你有所帮助....

select Employeename,DOB 
from Employeemaster
where day(Dob)>day(getdate()) and month(DOB)>=month(getDate())
于 2009-02-09T15:30:56.733 回答
0

这是几个经过测试的答案的组合。这将在某个日期和他们的年龄之后找到下一个生日。此外,numdays 将限制您查看的范围 7 天 = 周等。

SELECT DISTINCT FLOOR(DATEDIFF(dd,Birthday, @BeginDate) / 365.25) + 1 age,
DATEADD(yyyy, FLOOR(DATEDIFF(dd,Birthday, @BeginDate) / 365.25) + 1, Birthday) nextbirthday, birthday
FROM         table
WHERE     DATEADD(yyyy, FLOOR(DATEDIFF(dd,Birthday, @BeginDate) / 365.25) + 1, Birthday) > @BeginDate  
AND DATEADD(yyyy, FLOOR(DATEDIFF(dd,Birthday, @BeginDate) / 365.25) + 1, Birthday) < DATEADD(dd, @NumDays, @BeginDate)
order by nextbirthday
于 2010-01-26T21:36:42.957 回答
0

实现相同目标的最佳方法是

DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME

SELECT Member.* from vwMember AS Member  
WHERE (DATEADD(YEAR, (DATEPART(YEAR, @StartDate) -
                      DATEPART(YEAR, Member.dBirthDay)), Member.dBirthDay)
BETWEEN @StartDate AND @EndDate)
于 2010-03-11T14:00:13.047 回答
0

我将它用于MySQL,可能不是最有效的查询方式,但实现起来足够简单。

select * from `schema`.`table` where date_format(birthday,'%m%d') >= date_format(now(),'%m%d') and date_format(birthday,'%m%d') < date_format(DATE_ADD(NOW(), INTERVAL 5 DAY),'%m%d');
于 2012-01-06T17:48:37.673 回答
0

我相信这张票很久以前就已经关闭了,但是为了获得正确的 sql 查询,请看一下。

SELECT Employee_Name, DATE_OF_BIRTH
FROM Hr_table 
WHERE 

/**
fetching the original birth_date and replacing the birth year to the current but have to  deduct 7 days to adjust jan 1-7 birthdate.
**/

datediff(d,getdate(),DATEADD(year,datediff(year,DATEADD(d,-7,hr.DATE_OF_BIRTH),getdate()),hr.date_of_birth)) between 0 and 7

-- current date looks ahead to 7 days for upcoming modified year birth date.

order by

-- sort by no of days before the birthday
datediff(d,getdate(),DATEADD(year,datediff(year,DATEADD(d,-7,hr.DATE_OF_BIRTH),getdate()),hr.date_of_birth))
于 2012-05-09T22:34:41.807 回答
0

更好更简单的解决方案:

select * from users with(nolock)
where date_of_birth is not null 
and 
(
      DATEDIFF(dd,
                  DATEADD(yy, -(YEAR(GETDATE())-1900),GETDATE()), --Today
                  DATEADD(yy, -(YEAR(date_of_birth)-1901),date_of_birth)
      ) % 365
) = 30
于 2013-11-29T13:48:00.597 回答
0

该解决方案还考虑了下一年的生日和排序:(dob = 出生日期;bty = 今年生日;nbd = 下一个生日)

with rs (bty) as (
    SELECT DATEADD(Year, DATEPART(Year, GETDATE()) - DATEPART(Year, dob), dob) as bty FROM Employees
),
rs2 (nbd) as (
  select case when bty < getdate() then DATEADD(yyyy, 1, bty) else bty end as nbd from rs
)
select nbd, DATEDIFF(d, getdate(), nbd) as diff from rs2 where DATEDIFF(d, getdate(), nbd) < 14 order by diff

此版本避免了日期比较,可能会更快:

with rs (dob, bty) as (
    SELECT dob, DATEADD(Year, DATEPART(Year, GETDATE()) - DATEPART(Year, DOB), DOB) as bty FROM employee
),
rs2 (dob, nbd) as (
  select dob,  DATEADD(yyyy, FLOOR(ABS((-1*(SIGN(DATEDIFF(d, getdate(), bty))))+0.1)), bty) as nbd from rs
),
rs3 (dob, diff) as (
  select dob, datediff(d, getdate(), nbd) as diff from rs2
)
select dob, diff  from rs3 where diff < 14 order by diff

如果范围涵盖明年的 2 月 29 日,则使用:

with rs (dob, ydiff) as (
  select dob, DATEPART(Year, GETDATE()) - DATEPART(Year, DOB) as ydiff from Employee
),
rs2 (dob, bty, ydiff) as (
  select dob, DATEADD(Year, ydiff, dob) as bty, ydiff from rs
),
rs3 (dob, nbd) as (
  select dob, DATEADD(yyyy, FLOOR(ABS((-1*(SIGN(DATEDIFF(d, getdate(), bty))))+0.1)) +  ydiff, dob) as nbd from rs2
),
rs4 (dob, ddiff, nbd) as (
  select dob, datediff(d, getdate(), nbd) as diff, nbd from rs3
)
select dob, nbd, ddiff from rs4 where ddiff < 68 order by ddiff
于 2015-07-03T14:18:36.903 回答
0

您还可以使用DATEPART

-- To find out Today's Birthday
DECLARE @today DATETIME
SELECT  @today = getdate()

SELECT *
FROM SMIS_Registration 
WHERE (DATEPART (month, DOB) >= DATEPART (month, @today)
      AND DATEPART (day, DOB) = DATEPART (day, @today))
于 2015-07-31T11:40:17.583 回答
0

选择 BirthDate,Name fromEmployees order by Case WHEN convert(nvarchar(5),BirthDate,101) > convert(nvarchar(5),GETDATE(),101) 然后 2 WHEN convert(nvarchar(5),BirthDate,101) < convert(nvarchar(5),GETDATE(),101) 然后 3 WHEN 转换(nvarchar(5),BirthDate,101) = convert(nvarchar(5),GETDATE(),101) 然后 1 else 4 end ,convert(nvarchar (2),出生日期,101),转换(nvarchar(2),出生日期,105)

于 2016-09-22T11:30:08.457 回答
0

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

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 ;

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

于 2018-09-12T16:07:47.883 回答
0

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

于 2019-04-07T10:33:59.937 回答
0

您可以将此查询用于今天的生日

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))
于 2021-11-10T05:27:03.880 回答
0

这里我们需要 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;
于 2021-12-29T23:07:20.747 回答
-1

试试我的解决方案...我有 Informix 数据库...

SELECT person, year(today)-year(birthdate) as years, birthdate,

CASE
WHEN MOD(year(birthdate)+((year(today)-year(birthdate))+1),4)<>0 AND MONTH(birthdate)=2 AND DAY(birthdate)=29 THEN 
   CASE 
   WHEN mdy(month(birthdate), 28, year(birthdate)+((year(today)-year(birthdate))+1))-today >= 365 THEN (mdy(month(birthdate), 28, year(birthdate)+((year(today)-year(birthdate))+1))-today)-365
   WHEN mdy(month(birthdate), 28, year(birthdate)+((year(today)-year(birthdate))+1))-today < 365 THEN mdy(month(birthdate), 28, year(birthdate)+((year(today)-year(birthdate))+1))-today
   END
ELSE
   CASE 
   WHEN mdy(month(birthdate), day(birthdate), year(birthdate)+((year(today)-year(birthdate))+1))-today >= 365 THEN (mdy(month(birthdate), day(birthdate), year(birthdate)+((year(today)-year(birthdate))+1))-today)-365
   WHEN mdy(month(birthdate), day(birthdate), year(birthdate)+((year(today)-year(birthdate))+1))-today < 365 THEN mdy(month(birthdate), day(birthdate), year(birthdate)+((year(today)-year(birthdate))+1))-today
   END
END until

FROM table_name
WHERE mdy(month(birthdate), day(birthdate), 2000) >= mdy(month(today), day(today), 2000)
AND mdy(month(birthdate), day(birthdate), 2000) <= mdy(month(today), day(today), 2000)+30
OR
mdy(month(birthdate), day(birthdate), 2000) <= mdy(month(today), day(today), 2000)-(365-30)
ORDER BY 4, YEAR(birthdate)
于 2010-12-04T09:33:27.780 回答
-1
CREATE PROCEDURE [dbo].[P_EmployeesGetBirths]
        @Date Date,
        @Days int
    as
    Begin
        SET NOCOUNT ON;

        Declare
            @From int = Month(@Date) * 100 + Day(@Date),
            @To int = Month(DateAdd(DD, @Days, @Date)) * 100 + Day(DateAdd(DD, @Days, @Date)),
            @NeutralDate Date = Cast('1900-'+cast(Month(@Date) as nvarchar(2))+'-' + cast(Day(@Date) as nvarchar(2)) as Date)

        Select
            DOB,
            DATEADD(DD, DateDiff(DD, @NeutralDate, DateAdd(YY, 1900-Year(DOB), DOB)), @Date) OnDate
        From
            Employees(nolock)
        Where
            DOB is not null and
            Month(DOB) * 100 + Day(DOB) between @From and @To
        order by
            Month(DOB) * 100 + Day(DOB)
    End
    Go
于 2013-03-31T08:21:06.790 回答
-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)
于 2016-02-26T10:31:27.000 回答
-2

更好的是,将年份差异添加到生日日期,以制作今年的所有内容,然后进行比较

SELECT * FROM Employees WHERE
  DATEADD ( year, YEAR(@Today) - YEAR(@Birthday), birthday) BETWEEN @Today AND @EndDate
于 2008-09-17T14:02:33.577 回答