2016-04-04 7 views
1

私はTSQLについて学んでおり、特定の一連の映画について詳しく説明するAppを行うように割り当てられています。私が完成した製品に追加したいものの1つは、主演女優誕生日と映画​​の初日ですが、初演時に俳優の年齢を返すDATEDIFFです。DATEDIFF関数のテーブル値を使用する

私の質問は、それらの日付がすでにテーブルに存在する場合、DATEDIFFステートメントを指定すると、どのように日付を指定するのですか?

表の例が続きます。

ボンド

BondID FirstName LastName Birthdate 
1  Sean  Connery 8/25/1930 
2  George  Lazenby 9/5/1939 
3  Roger  Moore  10/14/1927 
4  Timothy  Dalton  3/21/1946 
5  Pierce  Brosnan 5/16/1953 
6  Daniel  Craig  3/2/1968 

フィルム

ID BondID FilmTitle    Premiere 
1  1  Dr. No    1963-05-08 
2  1  From Russia With Love 1974-04-08 
3  1  Goldfinger   1964-12-22 
4  1  Thunderball   1965-12-29 

ここで私が現在持っているものです。

SELECT b.Birthdate, f.Premiere, b.FirstName, b.LastName, f.FilmTitle 
FROM Bond b INNER JOIN FilmID f ON b.BondID = f.BondID 
WHERE b.BondID = 1 

SELECT DATEDIFF(YEAR, GETDATE(), GETDATE()) AS "YearDif" 
WHERE GETDATE() = Bond.Birthdate AND GETDATE() = f.Premiere 

データ私は初演の時に俳優の年齢を述べて列を追加したいと思います

 Birthdate Premiere FirstName LastName FilmTitle 
1 1930-08-25 1963-05-08 Sean  Connery Dr. No 
2 1930-08-25 1974-04-08 Sean  Connery From Russia With Love 
3 1930-08-25 1964-12-22 Sean  Connery Goldfinger 
4 1930-08-25 1965-12-29 Sean  Connery Thunderball 

...私はその1のハンドルを持っていると思います...しかし...

DATEDIFF部分の2番目の部分は正しくありませんが、DATEDIFFに日付の値を取得する方法を教えてください。

何か助けが奇妙になるでしょう!

+2

おそらくGETDATE( )。現在のシステム時間を返します。それはあなたのDATEDIFFが常に0を返すことを意味します。そして私はあなたが正確なシステム時間と一致するPremiereのBirthdateの価値がないと仮定します。あなたのケースでは、DATEDIFFのようなものになります(Year、Bond.Birthdate、f.Premiere )。注意すべき点の1つは、DATEDIFFが交差するしきい値の数を数えることです。その日から何年経ったかはわかりません。 –

答えて

1

あなたのクエリ:

SELECT DATEDIFF(YEAR, GETDATE(), GETDATE()) AS "YearDif" 
WHERE GETDATE() = Bond.Birthdate AND GETDATE() = f.Premiere 

が動作しません。あなたが望むもののために。 GETDATE()は今日の日付のみを返しますので、クエリが実行された瞬間に誕生日と初日が今日だった場合は、上記の行が返されます。

サンプルデータ:

IF OBJECT_ID('tempdb..#Bond') IS NOT NULL 
DROP TABLE #Bond 
CREATE TABLE #Bond 
(BondID INT ,FirstName VARCHAR(20),LastName VARCHAR(20),Birthdate DATE) 

INSERT INTO #Bond 
VALUES 
(1  ,'Sean'  ,'Connery' ,'8/25/1930') 
,(2  ,'George'  ,'Lazenby' ,'9/5/1939') 
,(3  ,'Roger'  ,'Moore'  ,'10/14/1927') 
,(4  ,'Timothy'  ,'Dalton'  ,'3/21/1946') 
,(5  ,'Pierce'  ,'Brosnan' ,'5/16/1953') 
,(6  ,'Daniel'  ,'Craig'  ,'3/2/1968') 

IF OBJECT_ID('tempdb..#Film') IS NOT NULL 
DROP TABLE #Film 

CREATE TABLE #Film 
(ID INT , BondID INT , FilmTitle  VARCHAR(50),  Premiere DATE) 
INSERT INTO #Film 
VALUES (1 , 1,'Dr. No'    ,'1963-05-08') 
,(2 , 1,'From Russia With Love','1974-04-08') 
,(3 , 1,'Goldfinger'   ,'1964-12-22') 
,(4 , 1,'Thunderball'   ,'1965-12-29') 

QUERY:

SELECT b.Birthdate, f.Premiere, b.FirstName, b.LastName, f.FilmTitle , DATEDIFF(YEAR, b.Birthdate, Premiere) AS AgeOfActor 
FROM #Bond b INNER JOIN #Film f ON b.BondID = f.BondID 

結果:

enter image description here

何をする必要があるが、以下のQUERY部であり、応答がコメントに:

あなたはいつもの日を数えることができ、その後、devide 365によって:

SELECT b.Birthdate, f.Premiere, b.FirstName, b.LastName, f.FilmTitle , DATEDIFF(day, b.Birthdate, Premiere)/365 AS AgeOfActor 
FROM #Bond b INNER JOIN #Film f ON b.BondID = f.BondID 

enter image description here

以上の精度のためにあなたは数秒でそれを行うことができます:P

SELECT b.Birthdate, f.Premiere, b.FirstName, b.LastName, f.FilmTitle , DATEDIFF(second, b.Birthdate, Premiere)/(365.25*24*60*60) AS AgeOfActor 
FROM #Bond b INNER JOIN #Film f ON b.BondID = f.BondID 

enter image description here

+1

これは本当に近いですが、俳優の時代は必ずしも正しいとは限りません。 "Dr. No"を見ると、彼は初演の時に32歳になっていました。 43 "愛とロシアから"。これは、DATEDIFF –

+0

@SeanLangeの課題です.GETDATE()は常にdatepartを使って比較するので、常に難しいです。しかし、私の答えであなたのコメントに私の返信を参照してください。 –

+0

@SeanLange実際に秒の計算を見ると、一度0に切り上げると、年計算に近い –

0

このようなことは、SQLで一段階で行うことができます。中間結果を後で通過させる場所に保存する必要はありません。

あなたはちょうどそのような関数呼び出しにテーブルから自分の列の値を渡す必要があり

:俳優は、彼/彼女がで再生映画のプレミア日までに生まれたと仮定すると

SELECT 
b.Birthdate, f.Premiere, b.FirstName, b.LastName, f.FilmTitle, 
DATEDIFF(YEAR, b.Birthdate, f.Premiere) AS actor_age_at_premiere 
FROM 
Bond b 
INNER JOIN FilmID f 
    ON b.BondID = f.BondID 

(これは公正な仮定です)、結果はプラスのIntegerになります。

あなたが今のよう俳優時代を含めたい場合は、あなたの3番目の引数はGETDATE()の代わりPremiere列のようになります。

DATEDIFF(Year, b.Birthdate, GETDATE()) AS actor_age_current 
関連する問題