2016-12-28 48 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 

附加信息:

正如我不希望這個觀點去大了,我只希望視圖來顯示當前的年,而t他明年。因此,一旦2017年來臨時,我想這個觀點來調整顯示2017年和2018年

三江源在這個問題上的幫助,IM希望它不會成爲困難

表創建和數據:

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 Server? –

+0

我有2016年數據中心 – Crezzer7

回答

5

您可以使用一個簡單的CROSS APPLY和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

完美謝謝你我已經改變了我的查詢,當你有測試。 Thankyou的幫助 – 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; 
相關問題