2016-12-28 62 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;