2015-03-19 2 views
0

Вот мой код, но его показ нулевой, а сегодня в пятницу. Но я хотел бы получить последний рабочий день.Последний рабочий день показывает нулевое время, пока на выходных

-- Insert statements for procedure here 
--Below is the param you would pass 
DECLARE @dateToEvaluate date=GETDATE(); 

--Routine 
DECLARE @startDate date=CAST('1/1/'+CAST(YEAR(@dateToEvaluate) AS char(4)) AS date); -- let's get the first of the year 

WITH 
tally(n) AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL))-1 FROM sys.all_columns), 
dates AS (
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS dt_id, 
      DATEADD(DAY,n,@startDate) AS dt, 
      DATENAME(WEEKDAY,DATEADD(DAY,n,@startdate)) AS dt_name 
    FROM tally 
    WHERE n<366 --arbitrary 
    AND DATEPART(WEEKDAY,DATEADD(DAY,n,@startDate)) NOT IN (6) 
    AND DATEADD(DAY,n,@startDate) NOT IN (SELECT CAST(HolidayDate AS date) FROM Holiday)), 
curr_id(id) AS (SELECT dt_id FROM dates WHERE [email protected]) 
SELECT d.dt 
FROM dates AS d 
CROSS JOIN 
curr_id c 
WHERE d.dt_id+1=c.id 
+0

Можете ли вы более четко указать, что именно вы пытаетесь вычислить? –

+0

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

+0

Боюсь, я до сих пор не понимаю. Вы пытаетесь рассчитать предыдущий день недели (с понедельника по пятницу) с учетом ввода даты? Такое, что ввод 2015-03-20 будет производить 2015-03-19, а ввод 2015-03-23 ​​будет производить 2015-03-19? –

ответ

0

Приведенный ниже код примет любую дату и «идет назад», чтобы найти предыдущий день недели (M-F), который не находится в таблице @ праздников.

declare @currentdate datetime = '2015-03-22' 

declare @holidays table (holiday datetime) 
insert @holidays values ('2015-03-20') 

;with cte as (
    select 
    @currentdate k 
    union all 
    select 
    dateadd(day, -1, k) 
    from cte 
    where 
    k = @currentdate 
    or ((datepart(dw, k) + @@DATEFIRST - 1 - 1) % 7) + 1 > 5 --determine day of week independent of culture 
    or k in (select holiday from @holidays) 
) 
select min(k) from cte 
+0

На самом деле, мое кодирование работает нормально. Это показывает последний рабочий день. Например, сегодня суббота, и мой запрос возвращается 19-03-2015 (четверг), но когда я выполняю запрос в пятницу, он показывает нулевое значение. Friday - это наши выходные. В то время как я посещаю мой сайт в пятницу, он показывает ошибку для этого запроса, но он в порядке в другой день. –

+0

Похоже, ваш код на самом деле не работает нормально. –

+0

Да, вы правы. ваш код потрясающий. Работает . Большое спасибо. –

0

dates таблица не имеет никаких дат ПЯТНИЦА в нем. Измените NOT IN (6) на NOT IN (1, 7). Это удалит субботу и воскресенье с даты.

+0

Спасибо за ваш ответ. но пока сегодня суббота или воскресенье, а затем получение нулевого значения. Для вас любезная информация, я использую этот запрос для показа последнего рабочего дня. но пока сегодня будний день, а не показ моего отчета. в другие дни отчет работает нормально. –

+0

Что вы хотите вернуть в субботу или воскресенье? – Steven

+0

Собственно, мое кодирование работает нормально. Это показывает последний рабочий день. Например, сегодня суббота, и мой запрос возвращается 19-03-2015 (четверг), но когда я выполняю запрос в пятницу, он показывает нулевое значение. Friday - это наши выходные. В то время как я посещаю мой сайт в пятницу, он показывает ошибку для этого запроса, но он в порядке в другой день. –

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