2016-04-04 6 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 

Film

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. И я просто предположим, что у вас нет значения для Birthdate of 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() вернется только к сегодняшней дате, так что в сущности вышеизложенное вернет только строку, если дата рождения и премьера были сегодня в тот самый момент, когда вы запустили запрос.

Что вам нужно сделать, это есть раздел QUERY ниже:

SAMPLE DATA:

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:

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

Это действительно близко, но возраст актера не всегда правильный. Посмотрите на «Доктор Нет», ему было бы 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.

Если вы хотите включить актера возраст, как сейчас, то ваш третий аргумент был бы GETDATE() вместо Premiere колонки:

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

 Смежные вопросы

  • Нет связанных вопросов^_^