2016-07-19 3 views
0

Я пытаюсь получить количество рабочих дней в течение ряда дат и назначить его переменной, и я не могу ее получить. Я попробовал только мой подзапрос, и он отлично работает, чтобы получить разные даты, но мне нужно их подсчитать. Вот код, который я хотел бы работать:Подсчет с SQL SubQuery из пункта не работает

declare @end date='2016/05/06' 
declare @begin date = DATEADD(month, DATEDIFF(month, 0, @end), 0) 
declare @begin31 date = DATEADD(MONTH, -1, @end) 

declare @tmprocdays int 

    @tmprocdays = select count(*) from (select distinct WORKDATE from Daily where WORKDATE between @begin and @end) <<<----- NOT WORKING 

ошибка говорит, что проблема находится рядом с) Я попытался положить то время как вещь в круглых скобках и что не работает.

ответ

1

попробовать это

declare @end date='2016/05/06' 
declare @begin date = DATEADD(month, DATEDIFF(month, 0, @end), 0) 
declare @begin31 date = DATEADD(MONTH, -1, @end) 

declare @tmprocdays int 

set @tmprocdays = select count(*) from (select distinct WORKDATE from Daily where WORKDATE between @begin and @end) a <<<----- NOT WORKING 

ИЛИ Заменить последние 2 строки выше этого:

select @tmprocdays = count(*) 
from 
(
    select distinct WORKDATE from Daily where WORKDATE between @begin and @end 
) a 

ИЛИ еще лучше

select @tmprocdays = count(distinct WORKDATE) from Daily where WORKDATE between @begin and @end 
+0

OMG - Я был на это в течение нескольких часов. Огромное спасибо!!!! Я не знал, что ты можешь отличить их. Ваше последнее решение очень элегантно. Спасибо. – Missy

+1

@ Missy, вам больше всего нравится ... просто проверьте изменения. Я добавил еще одну альтернативу в конце, которая может работать лучше. – objectNotFound

1

Основной проблемой является отсутствие круглых скобок aro и подзапрос.

Вот некоторые исправления в коде:

declare @end date = '2016-05-06'; 
declare @begin date = DATEADD(month, DATEDIFF(month, 0, @end), 0); 
declare @begin31 date = DATEADD(MONTH, -1, @end); 

declare @tmprocdays int; 

select @tmprocdays = count(distinct WORKDATE) 
from Daily 
where WORKDATE between @begin and @end ; 

Изменения:

  • Поместите @tmprocdays = в самом select заявлении. В вашем подзапросе отсутствуют скобки.
  • Добавлены точки с запятой в конец каждой строки.
  • Удалено в подзапрос, вместо этого используется count(distinct).
  • Изменена дата в формате ГГГГ-ММ-ДД. Это по крайней мере стандарт ISO.

Последние три косметические.

1

ЕКА всегда должно содержать либо имя таблицы, либо в случае подзапроса должны быть псевдоним:

Если добавить любой идентификатор (слово письма) после того, как ваш подзапрос будет нормально работать, например, :

@tmprocdays = select count(*) from (select distinct WORKDATE from Daily where WORKDATE between @begin and @end) xxx