복붙노트

[SQL] SQL 선택 다가오는 생일

SQL

SQL 선택 다가오는 생일

나는 곧입니다 생일이 직원을 선택하는 저장 프로 시저를 작성하는 것을 시도하고있다.

종업원 SELECT * FROM WHERE 생일> @Today 생일 <@Today + @NumDays

출생 연도 내 생일 '과 '09 -25-2008''09 -18-2008 사이에 떨어지지 않을 것 ''09 -18-1983했다 그렇다면, 생일의 일부이기 때문에이하지 않습니다 작동합니다.

날짜 필드의 연도 부분과 바로 비교 월 / 일을 무시하는 방법이 있나요?

그것은 아마도 새로운 년에 걸쳐 있도록이, 다가오는 생일의 경고를 관리자에게 매주 월요일 아침 실행됩니다.

여기에 내가 만들어 결국 그 작업 솔루션 덕분에 Kogus이다.

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

해결법

  1. ==============================

    1.참고 : 나는 중요한 버그이었다 믿는 것을 해결하기 위해이 편집했습니다. 현재 게시 버전은 나를 위해 작동합니다.

    참고 : 나는 중요한 버그이었다 믿는 것을 해결하기 위해이 편집했습니다. 현재 게시 버전은 나를 위해 작동합니다.

    당신이 당신의 데이터베이스에 해당하는 필드와 테이블 이름을 수정 한 후에이 작업을해야합니다.

    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이됩니다.

  2. ==============================

    2.경우에는 누군가가 여전히 MySQL을 (약간 다른 명령), 여기에 쿼리의 솔루션을 찾고있다 :

    경우에는 누군가가 여전히 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)
    
  3. ==============================

    3.DATEDIFF 및 DATEADD의 최고 사용. 아니 반올림, 아니 가까운 것 월 버그, 아무것도하지만, 날짜 함수없이 29 일

    DATEDIFF 및 DATEADD의 최고 사용. 아니 반올림, 아니 가까운 것 월 버그, 아무것도하지만, 날짜 함수없이 29 일

    @Gustavo 카르도소, 사람의 나이에 대한 새로운 정의 덕분에

  4. ==============================

    4.@strelc의 접근 방식을 좋아하지만, 자신의 SQL은 조금 떨어져 있었다. 다음은 잘 작동하고 사용하기 간단 업데이트 버전입니다 :

    @strelc의 접근 방식을 좋아하지만, 자신의 SQL은 조금 떨어져 있었다. 다음은 잘 작동하고 사용하기 간단 업데이트 버전입니다 :

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

    편집 2,017분의 10 : 끝으로 하루를 추가

  5. ==============================

    5.당신은 DAYOFYEAR 기능을 사용하지만 12 월에 월 생일 찾고 싶을 때주의 될 수있다. 나는 당신이 긴 기간을 당신이 새해에 걸쳐하지 않습니다 찾고있는대로 잘 될 것 같아요.

    당신은 DAYOFYEAR 기능을 사용하지만 12 월에 월 생일 찾고 싶을 때주의 될 수있다. 나는 당신이 긴 기간을 당신이 새해에 걸쳐하지 않습니다 찾고있는대로 잘 될 것 같아요.

  6. ==============================

    6.죄송 년을 중화하기위한 요구 사항을 보지 못했다.

    죄송 년을 중화하기위한 요구 사항을 보지 못했다.

    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)
    

    이 작업을해야합니다.

  7. ==============================

    7.나는 이것에 대한 해결책을 발견했다. 이것은 누군가의 소중한 시간을 절약 할 수 있습니다.

    나는 이것에 대한 해결책을 발견했다. 이것은 누군가의 소중한 시간을 절약 할 수 있습니다.

     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
    

    크로스 달과 날짜의 비교를 위해 날짜 체크에 참여합니다.

  8. ==============================

    8.내 생각 엔 "365.25"곧 이상 실패 할 것이다 사용하고 있습니다.

    내 생각 엔 "365.25"곧 이상 실패 할 것이다 사용하고 있습니다.

    나는 "365.25"를 사용하여 작업 솔루션을 테스트 그래서 그리고 그것은 모든 경우에 동일한 행 번호를 반환하지 않습니다. 예를 들어 여기 :

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

    2016 년과 2116으로 테스트하고 그 차이를 볼 수 있습니다. / 8에 의하여 / 7 두 쿼리를 볼 드 난 단지 하나 개의 링크 만 변화를 게시 할 수 있습니다. (/ 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
    
  9. ==============================

    9.이것은 MS SQL 서버 솔루션입니다 : 그것은 30 일 생일 직원을 반환합니다.

    이것은 MS SQL 서버 솔루션입니다 : 그것은 30 일 생일 직원을 반환합니다.

    SELECT * FROM rojstni_dnevi
      WHERE (DATEDIFF   (dd, 
                        getdate(), 
                        DATEADD (   yyyy, 
                                    DATEDIFF(yyyy, rDan, getdate()),
                                    rDan)
        nex             )
            +365) % 365 < 30
    
  10. ==============================

    10.한 달 미만의 경우 :

    한 달 미만의 경우 :

    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() ))))
    
  11. ==============================

    11.당신은 생일 날짜의 월과 일 부분을 추출 할 수 DATE_FORMAT를 사용할 수 있습니다.

    당신은 생일 날짜의 월과 일 부분을 추출 할 수 DATE_FORMAT를 사용할 수 있습니다.

    편집 : 미안 해요 그는 MySQL을 사용하지 않은 것을 보지 못했다.

  12. ==============================

    12.이 T-SQL 사용 DATEPART입니다 가정하면 별도로 달과 날짜를 비교합니다.

    이 T-SQL 사용 DATEPART입니다 가정하면 별도로 달과 날짜를 비교합니다.

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

    또한, 모든 사람의 생일에서 현재 연도의 1 월 1 일을 차감 한 후 1900 년 (또는 획기적인 해 무엇이든)을 사용하여 비교합니다.

  13. ==============================

    13.이러한 솔루션의 대부분은 가까이,하지만 당신은 몇 가지 추가 시나리오를 기억해야합니다. 생일과 슬라이딩 스케일로 작업 할 때, 당신은 다음 달에 전환을 처리 할 수 ​​있어야합니다.

    이러한 솔루션의 대부분은 가까이,하지만 당신은 몇 가지 추가 시나리오를 기억해야합니다. 생일과 슬라이딩 스케일로 작업 할 때, 당신은 다음 달에 전환을 처리 할 수 ​​있어야합니다.

    예를 들어 스티븐스 예제 월의 마지막 사일까지 생일 잘 작동합니다. 당신이 아니라 그것을 위해 조건 그래서, 다음 달 29, 30, 및 다음 1, 2, 3 : 그럼 당신은 오늘 29 일이 될 것 인 경우 유효한 날짜와 같은 논리 오류가 있습니다.

    대안은 현재 연도의 생일 필드에서 날짜 및 하위 분석 표준 범위 비교를하는 것입니다.

  14. ==============================

    14.또 다른 생각은 :. 자신의 생일 (또는 생일이 아직 다음 위처럼 비교 발생하지 않은 경우 사용 DATEPART 및 DATEADD 이렇게 더 하나에 전체 년 동안 자신의 나이를 추가합니다.

    또 다른 생각은 :. 자신의 생일 (또는 생일이 아직 다음 위처럼 비교 발생하지 않은 경우 사용 DATEPART 및 DATEADD 이렇게 더 하나에 전체 년 동안 자신의 나이를 추가합니다.

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

    년에 걸친 범위의 가장자리 케이스는 특수 코드를 가지고해야합니다.

    보너스 팁 : BETWEEN ... AND 대신 생일 피연산자를 반복하는 사용하는 것이 좋습니다.

  15. ==============================

    15.이 작업을해야합니다 ...

    이 작업을해야합니다 ...

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

    16.나는 몇 년 전 내 대학 프로젝트와 같은 문제에 직면했다. 두 개의 열에 : (DD MM) 나는 연도와 날짜 분할에 의해 (다소 족제비 방법으로) 반응했다. 그리고 그 전에, 내 프로젝트의 동료는 단순히 모든 날짜를 얻고 있었다 및 프로그래밍 방식으로 그들을 통해 것. 우리는 변화가 너무 비효율적 이었기 때문에 - 내 솔루션이 하나 더 우아하지 않는 것이. 또한, 자사의 여러 앱의 잠시 동안 사용되었습니다 데이터베이스에 수행하는 아마 가능합니다.

    나는 몇 년 전 내 대학 프로젝트와 같은 문제에 직면했다. 두 개의 열에 : (DD MM) 나는 연도와 날짜 분할에 의해 (다소 족제비 방법으로) 반응했다. 그리고 그 전에, 내 프로젝트의 동료는 단순히 모든 날짜를 얻고 있었다 및 프로그래밍 방식으로 그들을 통해 것. 우리는 변화가 너무 비효율적 이었기 때문에 - 내 솔루션이 하나 더 우아하지 않는 것이. 또한, 자사의 여러 앱의 잠시 동안 사용되었습니다 데이터베이스에 수행하는 아마 가능합니다.

  17. ==============================

    17.이것을를 사용 해보세요 :

    이것을를 사용 해보세요 :

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

    18.견과류! 나는 이것에 대해 생각을 시작했을 때 나는 다시 대답 왔을 때 사이 좋은 솔루션입니다. :)

    견과류! 나는 이것에 대해 생각을 시작했을 때 나는 다시 대답 왔을 때 사이 좋은 솔루션입니다. :)

    나는 함께했다 :

    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 () 할 필요가 없습니다?

  19. ==============================

    19.이 시험 하였다 답변의 몇 가지의 조합입니다. 이것은 특정 날짜가 될 것입니다 세 이후 다음 brithday을 찾을 수 있습니다. 또한 NUMDAYS 등은 7 일 찾고있는 범위 = 주를 제한합니다

    이 시험 하였다 답변의 몇 가지의 조합입니다. 이것은 특정 날짜가 될 것입니다 세 이후 다음 brithday을 찾을 수 있습니다. 또한 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
    
  20. ==============================

    20.동일을 달성하는 가장 좋은 방법

    동일을 달성하는 가장 좋은 방법

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

    21.직원을위한 다가오는 생일 - SQLSERVER

    직원을위한 다가오는 생일 - 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)
    
  22. ==============================

    22.나는 쿼리하지만 구현하는 간단한 충분히에, MySQL을 위해 아마 가장 효율적인 방법을이를 사용했다.

    나는 쿼리하지만 구현하는 간단한 충분히에, 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');
    
  23. ==============================

    23.나는이 티켓이 폐쇄 나이 일 전하지만 올바른 SQL 쿼리가 봐주십시오지고의 이익을 위해왔다 생각합니다.

    나는이 티켓이 폐쇄 나이 일 전하지만 올바른 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))
    
  24. ==============================

    24.더 쉬운 솔루션 :

    더 쉬운 솔루션 :

    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
    
  25. ==============================

    25.나는 이것이 어떤 방법으로 U 도움이되기를 바랍니다 ....

    나는 이것이 어떤 방법으로 U 도움이되기를 바랍니다 ....

    select Employeename,DOB 
    from Employeemaster
    where day(Dob)>day(getdate()) and month(DOB)>=month(getDate())
    
  26. ==============================

    26.이 솔루션은 또한 내년 순서의 생일을 위해 처리합니다 : (DOB = 출생 일, BTY = 생일 올해; NBD = 다음 생일)

    이 솔루션은 또한 내년 순서의 생일을 위해 처리합니다 : (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
    
  27. ==============================

    27.또한 DATEPART을 사용할 수 있습니다 :

    또한 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))
    
  28. ==============================

    28.쿼리가 직원의 모든 다음 생일을 돌려 아래, 그것은 짧은 쿼리입니다.

    쿼리가 직원의 모든 다음 생일을 돌려 아래, 그것은 짧은 쿼리입니다.

    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 ;
    

    위 쿼리는 현재 날짜를 제외한 모든 다음 달 다룰 것입니다.

  29. ==============================

    29.sqlite3를위한 솔루션 :

    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로 나누어 솔루션은 나이를 얻기 위해, 또는 나를 위해 현재 연도 등으로 작업을 생년월일을하지 않았다 가져. 이것이하는 일은 계산해에게 두 daysOfTheYear (366)의 델타입니다. 생일이 올해는 아직 발생하지 않은 경우 자동으로 비교할 수 남은 일의 정확한 숫자를 얻을. 생일이 이미 일어난 경우, remaining_days는 음수가 될 것입니다, 당신은 여전히 ​​현재 연도에 일의 총량을 추가하여 남아있는 일의 정확한 수를 얻을 수 있습니다. 이 경우 여분의 일이 잘으로 추가되기 때문에이 또한 제대로 윤년을 처리 (사용하여 DAYOFYEAR (10 진수 31))

  30. ==============================

    30.

    select BirthDate,Name from Employees 
    order by 
    Case WHEN convert(nvarchar(5),BirthDate,101) > convert(nvarchar(5),GETDATE(),101) 
         then 2 
         WHEN convert(nvarchar(5),BirthDate,101) < convert(nvarchar(5),GETDATE(),101) 
         then 3
         WHEN convert(nvarchar(5),BirthDate,101) = convert(nvarchar(5),GETDATE(),101) 
         then 1 
         else 4 end, 
    convert(nvarchar(2),BirthDate,101),convert(nvarchar(2),BirthDate,105)
    
  31. from https://stackoverflow.com/questions/83531/sql-select-upcoming-birthdays by cc-by-sa and MIT license