2016-04-04 41 views
1

因此,我正在學習TSQL,並且已經分配了一個應用程序來詳細描述特定系列電影的內容。我想添加到成品中的一件事是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 

我想補充,指出演員的年齡首映的時間列...我想我有一個手柄...但是...

我得知DATEDIFF部分的第二部分不正確,但是如何告訴DATEDIFF在哪裏獲取日期值?

任何幫助將是奇葩!

+2

您可能需要閱讀有關GETDATE( )。它返回當前系統時間。這意味着你的DATEDIFF總是會返回0.我只是假設你對Premiere的出生日期沒有任何價值,它可以匹配確切的系統時間。在你的情況下,它將會像DATEDIFF(Year,Bond.Birthdate,f.Premiere )。有一點需要注意的是,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

迴應評論:

你可以隨時通過365算日子,然後devide:

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

這真的很接近,但演員的年齡並不總是正確的。看看「No」博士,他會在首映的時候32歲。 43「來自俄羅斯的愛情」。 DATEDIFF –

+0

@SeanLange就是這樣的挑戰,您說得對,始終是挑戰,因爲GETDATE()總是比較使用datepart。但請在我的回答中看到我的回覆。 –

+0

@SeanLange實際上,如果你看秒計算,一旦舍入到0 dp,它們更接近年計算 –

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

如果您想包括演員年齡作爲現在,那麼你的第三個參數是GETDATE()而不是Premiere列:

DATEDIFF(Year, b.Birthdate, GETDATE()) AS actor_age_current