2015-12-11 4 views
2

У меня есть следующий запрос, который я использую, чтобы попытаться получить разницу дат путем вычитания значений между двумя столбцами. Вот часть этого запроса:Ошибка при вычитании столбцов в SQL

SELECT 
ISNULL(MIN(c.CreatedOn), 0) AS [StartDate], 
ISNULL(MIN(s.CreatedOn), 0) AS [EndDate], 
Duration = [EndDate]-[StartDate] 
FROM MyTable 
INNER JOIN... 

ошибка, что я получаю состояние, что у меня есть недопустимые имена столбцов. Можно ли написать запрос таким образом?

+1

Вы приняли ответ очень быстро, и это может препятствовать более качественным ответам на публикацию. Подождите один или два дня и посмотрите, какие ответы на качество вы получите, принятый ответ правильный, но не охватывает лучшие решения. – TFD

ответ

1

Ранее определенные псевдонимы столбцов не могут использоваться в одном запросе. Вместо этого используйте фактический расчет.

SELECT 
ISNULL(MIN(c.CreatedOn), 0) AS [StartDate], 
ISNULL(MIN(s.CreatedOn), 0) AS [EndDate], 
Duration = ISNULL(MIN(s.CreatedOn), 0)-ISNULL(MIN(c.CreatedOn), 0) 
FROM MyTable 
INNER JOIN... 
+0

Спасибо, это имеет смысл. Спасибо за вашу помощь. –

1

Вы не можете использовать псевдонимы в рамках одного запроса. Если вы должны их использовать, вы можете использовать вложенный запрос или инструкцию WITH.

Вложенный запрос

Select StartDate, EndDate, 
     Duration = [EndDate]-[StartDate] 
From 
(
    SELECT 
    ISNULL(MIN(c.CreatedOn), 0) AS [StartDate], 
    ISNULL(MIN(s.CreatedOn), 0) AS [EndDate] 
    FROM MyTable 
    INNER JOIN... 
) InnerQuery 

С заявлением

;With InnerQuery AS 
(
    SELECT 
    ISNULL(MIN(c.CreatedOn), 0) AS [StartDate], 
    ISNULL(MIN(s.CreatedOn), 0) AS [EndDate] 
    FROM MyTable 
    INNER JOIN... 
) 
Select StartDate, EndDate, 
     Duration = [EndDate]-[StartDate] 
From InnerQuery 
0

есть datediff function

select datediff(day, min('12/01/2014'), min(getdate())) 

приписка, Что вы ожидаете, когда вы IsNull тип данных даты в int?

select isnull(cast(null as date), 0) 
Смежные вопросы