2014-02-14 2 views
1

Таблицы A - колонок B [DateTime]SQL Server: список по ближайшему дню рождения

нужны пользователи списка в этой таблице, заказ на ближайший день рождения. Пользователи, которые уже сделали день рождения, должны быть в конце списка, учитывая их на следующий год.

select B from A (order by/where)? 

Пример таблицы

USER  DATE 
MARCELO 1988-04-11 
RICARDO 1965-12-30 
WILSON 1977-02-20 
PABLO 1985-01-10 
JOHN  NULL 

Ожидаемый результат

WILSON 20/02 (Month/Day) 
MARCELO 11/04 
RICARDO 30/12 
PABLO  10/01 
(JOHN NOT IN THE LIST) 
+2

Просьба представить выборочные данные и желаемые результаты. –

+0

Я отредактировал мой вопрос – MarceloMadnezz

ответ

1

Data Test

DECLARE @TABLE TABLE(Name VARCHAR(100),Dob DATETIME) 
INSERT INTO @TABLE VALUES 
('Mark', '19961017'),('Josh', '19801119'),('Sam', '19700709'), 
('Vicky', '19500210'),('Dom', '19890308'),('Paul', '19840401') 
,('Nick', NULL) 

Запрос

SELECT Name, CAST(MONTH(Dob) AS NVARCHAR(2)) 
       + '/' + CAST(DAY(Dob) AS NVARCHAR(2)) [Dob Month/Day] 
FROM @TABLE 
WHERE DATEPART(DAYOFYEAR,Dob) - DATEPART(DAYOFYEAR,GETDATE()) > 0 
ORDER BY ABS(DATEPART(DAYOFYEAR,Dob) - DATEPART(DAYOFYEAR,GETDATE())) 

Результат Набор

Vicky Пользователь будет фильтроваться как день рождения ушел.

╔══════╦═══════════════╗ 
║ Name ║ Dob Month/Day ║ 
╠══════╬═══════════════╣ 
║ Dom ║ 3/8   ║ 
║ Paul ║ 4/1   ║ 
║ Sam ║ 7/9   ║ 
║ Mark ║ 10/17   ║ 
║ Josh ║ 11/19   ║ 
╚══════╩═══════════════╝ 

набор Результат заказана который день рождения рядом

+0

Работал гладко, спасибо большое! – MarceloMadnezz

+0

Рад, что это помогло, я еще больше обновил свой ответ, чтобы получить результаты в формате, показанном в вашем ожидаемом наборе результатов. –

+2

Итак, когда вы запускаете это 12/31, что происходит? – granadaCoder

1
select name, birthdate 
from yourtable 
where birthdate is not null 
order by datepart(dy,dateadd(d,- DATEPART(dy, getdate()),birthdate)) 
+0

Привет, подолюска, спасибо за ваше время. Я отредактировал свой вопрос с ожидаемым результатом. Вы можете повторить запрос, чтобы он соответствовал этому условию? – MarceloMadnezz

+0

Спасибо за ваше время, наш друг М.Али код работал гладко – MarceloMadnezz

1

Это решение: "обтекает" в течение всего года. , а также позволяет «сколько месяцев проецировать» фильтр.

IF OBJECT_ID('tempdb..#Employee') IS NOT NULL 
    begin 
      drop table #Employee 
    end 


    CREATE TABLE #Employee 
    ( 
    SurrogateKeyIDENTITY int not null IDENTITY (1,1) , 
    NameOf varchar(12) not null , 
    BirthDate datetime not null 
    ) 


    Insert into #Employee (NameOf, BirthDate) 

    Select 'A', '01/01/1999' 
    UNION ALL Select 'B', '01/16/1941' 
    UNION ALL Select 'C', '01/29/1965' 
    UNION ALL Select 'D', '02/13/1944' 
    UNION ALL Select 'P', '02/14/1978' 
    UNION ALL Select 'Q', '02/15/1984' 
    UNION ALL Select 'R', '03/13/1948' 
    UNION ALL Select 'S', '04/16/1983' 
    UNION ALL Select 'T', '05/17/1953' 
    UNION ALL Select 'U', '07/19/1959' 
    UNION ALL Select 'V', '08/16/1959' 
    UNION ALL Select 'W', '09/1/1959' 
    UNION ALL Select 'X', '10/30/1959' 
    UNION ALL Select 'Y', '11/16/1959' 
    UNION ALL Select 'Z', '12/31/1972' 


Declare @MyCURRENT_TIMESTAMP datetime 
/* select @MyCURRENT_TIMESTAMP = CURRENT_TIMESTAMP */ 
select @MyCURRENT_TIMESTAMP = '02/14/2014' 

Declare @NumberOfMonthsToGoOut int 
select @NumberOfMonthsToGoOut = 12 



;WITH myCalculationsCTE (NameOf, BirthDate, [NoYearBirthDate] , [NoYearCurrentDate]) 
AS 
(
    SELECT NameOf, BirthDate 
    , DATEFROMPARTS(1900 , MONTH(BirthDate), DAY (BirthDate)) [NoYearBirthDate] 
    , DATEFROMPARTS(1900 , MONTH(@MyCURRENT_TIMESTAMP), DAY (@MyCURRENT_TIMESTAMP)) [NoYearCurrentDate] 
    FROM #Employee 
    WHERE BirthDate IS NOT NULL 
) 
, 
myCTE (NameOf, BirthDate, [NoYearBirthDate] , [NoYearCurrentDate] , DerivedMonthDiff) 
AS 
(
    SELECT NameOf, BirthDate 
    , [NoYearBirthDate] 
    , [NoYearCurrentDate] 

    , [DerivedMonthDiff] = CASE 
     WHEN [NoYearBirthDate] >= [NoYearCurrentDate] 
      then DATEDIFF(m , [NoYearCurrentDate], [NoYearBirthDate]) 
     else 
      DATEDIFF(m , [NoYearCurrentDate], [NoYearBirthDate]) + 12 end 

    FROM myCalculationsCTE 
) 

SELECT NameOf, BirthDate , [NoYearBirthDate] , [NoYearCurrentDate] 
    , DerivedMonthDiff 
    , MONTH([NoYearBirthDate]) [Month] 
    , DAY ([NoYearBirthDate]) [DayOf] 

    FROM myCTE 
    where [DerivedMonthDiff] <= @NumberOfMonthsToGoOut 
    order by DerivedMonthDiff , MONTH([NoYearBirthDate]) , DAY ([NoYearBirthDate]) 

    IF OBJECT_ID('tempdb..#Employee') IS NOT NULL 
    begin 
      drop table #Employee 
    end 
+0

Спасибо за ваше время, наш друг код M.Ali работал гладко. – MarceloMadnezz

+0

Это потому, что я написал это, прежде чем вы разместили образцы данных ddl и образцов. ... С днем ​​Святого Валентина. – granadaCoder

+0

Я пересмотрел свой ответ, чтобы получить день рождения в течение года, но в правильном порядке относительно сегодняшней даты (02/14/2014 для моего примера) – granadaCoder

1
SELECT Name, CAST(MONTH(BIRTHDAY) AS NVARCHAR(2)) 
       + '/' + CAST(DAY(BIRTHDAY) AS NVARCHAR(2)) [Dob Month/Day],DATEPART(DAYOFYEAR,BIRTHDAY) as [dayofyear], 
       case when (DATEPART(DAYOFYEAR,BIRTHDAY) - DATEPART(DAYOFYEAR,GETDATE()) > 0) 
       THEN 
       DATEPART(DAYOFYEAR,BIRTHDAY) - DATEPART(DAYOFYEAR,GETDATE()) 
       ELSE 
       DATEPART(DAYOFYEAR,BIRTHDAY) + 365-DATEPART(DAYOFYEAR,GETDATE()) 
       END 
       AS [DAYSTILLBURTHDAY] 
FROM CONTACTS 
WHERE BIRTHDAY <> '9999-01-01 00:00:00.000' 
ORDER BY (case when (DATEPART(DAYOFYEAR,BIRTHDAY) - DATEPART(DAYOFYEAR,GETDATE()) > 0) 
       THEN 
       DATEPART(DAYOFYEAR,BIRTHDAY) - DATEPART(DAYOFYEAR,GETDATE()) 
       ELSE 
       DATEPART(DAYOFYEAR,BIRTHDAY) + 365-DATEPART(DAYOFYEAR,GETDATE()) 
       END) 
+0

незначительное смещение в [DAYSTILLBURTHDAY] (которое не было частью вопроса), но правильный и полный список. – bummi

Смежные вопросы