我目前有一张表格,上面写着姓名,出生日期和出生月份。
示例表数据:
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 :(得分: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;