SQL Server基于月和日的生日列表

时间:2016-12-28 12:26:31

标签: sql 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)

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 :(得分: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;