2015-07-02 5 views
-2
DECLARE @Daystaken TABLE(
Application VARCHAR(20), 
StatusId VARCHAR(2), 
Flag INT, 
Createddate Datetime) 

INSERT INTO @Daystaken (CreatedDate)VALUES 
('2015-03-06 17:59:59.410'), 
('2015-03-02 17:59:59.410') 
select DATEDIFF(DD,MIN(CreatedDate),GETDATE())D from @Daystaken 

DECLARE @holiday TABLE(holiday Datetime) 

INSERT INTO @holiday ( holiday)VALUES 
( '2014-04-06 17:59:59.410'), 
( '2014-06-06 17:59:59.410'), 
( '2015-05-05 17:59:59.410'), 
( '2015-05-01 17:59:59.410'), 
( '2013-01-06 17:59:59.410'), 
( '2015-02-03 17:59:59.410'), 
( '2011-02-01 17:59:59.410') 

я получил дней от DaysTaken таблицы Теперь мне нужно вычитать дни из отпуска table.For Пример daystaken таблицы имеют 122 дней в том, что дни 3 дней отпуска по настоящее время дата пришли из отпуска table.So мне нужно минус результат и показать 119 днейКак узнать дни из другой таблицы подсчета

+0

, что случилось с этим вопросом, получить минус – mohan111

+0

пожалуйста, проверьте вопрос внимательно я уже получил отсчет дней, но как минус праздники @ StanislovasKalašnikovas – mohan111

+0

это должно быть 120, потому что есть только 2 праздника от «2015 -03-02» до текущей даты. –

ответ

1

Будет ли это делать:

DECLARE @minDate AS DATE 
SELECT @minDate = MIN(Createddate) FROM @Daystaken; 

SELECT DATEDIFF(DAY, @minDate, GETDATE()) - COUNT(*) FROM @holiday 
WHERE 
    CAST(holiday AS DATE) >= @minDate 
    AND CAST(holiday AS DATE) <= CAST(GETDATE() AS DATE) 

Вот еще один, который не использовать любая переменная и может быть повернут легко в ITVF:

WITH E1(N) AS(
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 
), 
E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), 
E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), 
Tally(N) AS(
    SELECT TOP (DATEDIFF(DAY, @minDate, GETDATE())) 
     ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) 
    FROM E4 
), 
CteMinDate(minDate) AS(
    SELECT CAST(MIN(CreatedDate) AS DATE) FROM @Daystaken 
) 
SELECT 
    COUNT(*) 
FROM Tally t 
CROSS JOIN CteMinDate md 
WHERE 
    DATEADD(DAY, N - 1, md.minDate) <= CAST(GETDATE() AS DATE) 
    AND NOT EXISTS(
     SELECT 1 
     FROM @holiday 
     WHERE CAST(holiday AS DATE) = DATEADD(DAY, N - 1, md.minDate) 
    ) 
Смежные вопросы