2016-12-28 2 views
2

В настоящее время у меня есть таблица с именами, день рождения и месяц рождения.SQL Server список дней рождения по месяцам и дням

Пример таблицы данных:

Name   Day  Month 
Joe Bloggs  21   10 
Billy Earner 12   6 

Я построил запрос, который будет заполнять там день рождения на текущий год (2016 г.):

SELECT 
MyCalendarID, 
Name,  
CAST(CAST(DATEPART(YEAR, GETDATE()) AS varchar) + '-' + CAST(TheMonth AS varchar) + '-' + CAST(TheDay AS varchar) AS DATE) AS TheBirthday 
FROM MyCalendar 

Пример данных из запроса:

Name    DOB 
Joe Bloggs  2016-10-21 
Billy Earner 2016-06-12 

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

Вопрос: Возможно ли это, и если да, то как бы я идти о создании этой точки зрения в SQL Server

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

Name    DOB 
Joe Bloggs  2016-10-21 
Billy Earner 2016-06-12 
Joe Bloggs  2017-10-21 
Billy Earner 2017-06-12 

Дополнительная информация:

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

Спасибо за помощь в этом вопросе, им в надежде его не собирается быть сложной

Таблица Создание и данных:

CREATE TABLE MyCalendar (MyCalendarID INT IDENTITY (1,1) NOT NULL, 
Name VARCHAR(50), 
TheDay INT, 
TheMonth INT) 

ALTER TABLE MyCalendar ADD CONSTRAINT MyCalendarID_PK PRIMARY KEY (MyCalendarID) 

INSERT INTO MyCalendar VALUES ('Joe Bloggs', 21, 10) 
INSERT INTO MyCalendar VALUES ('Billy Earner', 12, 6) 
+0

Какой версией SQL-сервера вы работаете? –

+0

У меня есть дата-центр 2016 – Crezzer7

ответ

5

Вы можете использовать простой CROSS ОТНОСИТЬСЯ и DateFromParts()

Declare @YourTable table (Name varchar(50),Day int,Month int) 
Insert Into @YourTable values 
('Joe Bloggs',  21,   10), 
('Billy Earner', 12 ,  6) 


Select A.Name 
     ,B.DOB 
From @YourTable A 
Cross Apply (Values (DateFromParts(Year(GetDate()) ,A.Month,A.Day)) 
        ,(DateFromParts(Year(GetDate())+1,A.Month,A.Day)) 
      ) B (DOB) 

Возвращает

Name   DOB 
Joe Bloggs  2016-10-21 
Joe Bloggs  2017-10-21 
Billy Earner 2016-06-12 
Billy Earner 2017-06-12 
+0

, который отлично работает. Я только что изменил свой запрос при тестировании, как и у вас. Спасибо за помощь – Crezzer7

+1

очень приятное решение .. также функция DateFromParts() доступна SQLServer 2012 и далее .. –

+0

@ Crezzer7 С удовольствием помог –

3
SELECT 
MyCalendarID, 
Name,  
CAST(CAST(YEAR(GETDATE()) AS varchar(4)) + '-' + CAST(TheMonth AS varchar) + '-' + CAST(TheDay AS varchar) AS DATE) AS TheBirthday 
FROM MyCalendar 

UNION ALL 

SELECT 
MyCalendarID, 
Name,  
CAST(CAST(YEAR(GETDATE()) + 1 AS varchar(4)) + '-' + CAST(TheMonth AS varchar) + '-' + CAST(TheDay AS varchar) AS DATE) AS TheBirthday 
FROM MyCalendar 
2

Вы можете использовать общие табличные выражения (CTE), чтобы получить желаемые года, а затем присоединиться к нему с таблицей:

; WITH Years AS 
(
    SELECT YEAR(GETDATE()) AS TheYear 
    UNION SELECT YEAR(GETDATE()) + 1 
) 
SELECT 
MyCalendarID, 
Name,  
CAST(CAST(TheYear AS varchar) + '-' + CAST(TheMonth AS varchar) + '-' + CAST(TheDay AS varchar) AS DATE) AS TheBirthday 
FROM MyCalendar 
INNER JOIN Years ON 1 = 1; 
Смежные вопросы