2016-12-28 2 views
2

現在、名前、生年月日、生年月日が入力されたテーブルがあります。SQL Serverの月と日に基づく誕生日のリスト

例表データ:クエリから

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)を構築してい

Name   Day  Month 
Joe Bloggs  21   10 
Billy Earner 12   6 

しかし、私は同じテーブル内の次の年のためにこれを設定することができるようにしたい。ので、この表は、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ありがとう、この問題についてのヘルプは、イムは、その難しい

表の作成とデータにするつもりはないことを望ん

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

あなたが適用され、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; 
関連する問題