在 DATEDIFF 函数中使用 table 值
Using table values in DATEDIFF function
所以我正在学习 TSQL,并接到了一项任务,要开发一个应用程序来详细介绍某个系列电影的内容。我想添加到成品中的一件事是 DATEDIFF,其中我有主要演员的出生日期和电影的首映日期,但想要 return 演员的年龄首映式。
我的问题是,如果这些日期已经存在于 table 中,我该如何指定日期,给定 DATEDIFF 语句?
table 的示例如下。
债券
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 从哪里获取日期值?
任何帮助都会很棒!
这些事情在 SQL 中只需一步即可完成。无需将中间结果存储在任何地方以便稍后传递。
您只需将 table 中的列值传递到函数调用中即可:
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
假设演员出生在电影 he/she 首映日期之前(这是一个合理的假设),结果将是积极的 Integer
。
如果您现在想包括演员年龄,那么您的第三个参数将是 GETDATE()
而不是 Premiere
列:
DATEDIFF(Year, b.Birthdate, GETDATE()) AS actor_age_current
您的查询:
SELECT DATEDIFF(YEAR, GETDATE(), GETDATE()) AS "YearDif"
WHERE GETDATE() = Bond.Birthdate AND GETDATE() = f.Premiere
将无法满足您的需求。 GETDATE()
只会 return 今天的日期,所以如果在你 运行 查询的那一刻生日和首映是今天,上面的内容实际上只会 return 一行。
您需要做的是下面的 QUERY 部分:
示例数据:
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')
查询:
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
结果:
对评论的回应:
你总可以算天数然后除以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
或者为了更准确,您可以在几秒钟内完成: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
所以我正在学习 TSQL,并接到了一项任务,要开发一个应用程序来详细介绍某个系列电影的内容。我想添加到成品中的一件事是 DATEDIFF,其中我有主要演员的出生日期和电影的首映日期,但想要 return 演员的年龄首映式。
我的问题是,如果这些日期已经存在于 table 中,我该如何指定日期,给定 DATEDIFF 语句?
table 的示例如下。
债券
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 从哪里获取日期值?
任何帮助都会很棒!
这些事情在 SQL 中只需一步即可完成。无需将中间结果存储在任何地方以便稍后传递。
您只需将 table 中的列值传递到函数调用中即可:
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
假设演员出生在电影 he/she 首映日期之前(这是一个合理的假设),结果将是积极的 Integer
。
如果您现在想包括演员年龄,那么您的第三个参数将是 GETDATE()
而不是 Premiere
列:
DATEDIFF(Year, b.Birthdate, GETDATE()) AS actor_age_current
您的查询:
SELECT DATEDIFF(YEAR, GETDATE(), GETDATE()) AS "YearDif"
WHERE GETDATE() = Bond.Birthdate AND GETDATE() = f.Premiere
将无法满足您的需求。 GETDATE()
只会 return 今天的日期,所以如果在你 运行 查询的那一刻生日和首映是今天,上面的内容实际上只会 return 一行。
您需要做的是下面的 QUERY 部分:
示例数据:
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')
查询:
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
结果:
对评论的回应:
你总可以算天数然后除以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
或者为了更准确,您可以在几秒钟内完成: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