2014-09-16 2 views
0

У меня есть следующий запрос, выполняющийся с базой данных Sybase, которая предназначена для выбора двух предыдущих рабочих дней; игнорируя выходные (нас не волнуют праздники). Запрос работает, кроме понедельника, когда запрос возвращает только дату предыдущей пятницы - запуск запроса во вторник работает, возвращаясь в понедельник и в предыдущую пятницу. Я смотрел на него весь день и не могу понять, почему; может кто-нибудь помочь? К сожалению, в этой ситуации я не могу использовать таблицу календаря.Выберите ошибку запроса бизнес-дня

SELECT dateadd(dd, CASE DATEPART(dw, getdate()) 
WHEN 1 THEN -2 
WHEN 2 THEN -3 ELSE -1 
END, CONVERT (VARCHAR (10), dateadd(day, 0 getdate()), 102)), (SELECT dateadd(dd, CASE DATEPART(dw, CONVERT (VARCHAR (10), dateadd(day, -1, getdate()), 102)) 
WHEN 1 THEN -2 
WHEN 2 THEN -3 ELSE -1 
END, CONVERT (VARCHAR (10), dateadd(day, -1, getdate()), 102))) 

Любая помощь была бы принята с благодарностью!

+0

Какая база данных Sybase? Есть 3 разных варианта: SQLAnywhere (ASA), Adaptive Server Enterprise (ASE) или IQ – frlan

+0

@frlan Это экземпляр ASE – Ben

ответ

1

Я думаю, может быть, ваша логика была немного ошибочной (и, возможно, излишне сложной).

Я проверил это (с set datefirst 1 на понедельник в качестве первого дня недели), и он вернул правильные даты для Пн через Пятнадцать.

Логика говорит, что вычесть 4 дня, если понедельник или вторник (так что Mon -> Thu и Tue -> Fri), в противном случае 2 для самой старой даты и вычесть 3 дня, если Mon для второго старейшего (так что Mon -> Fri) в противном случае вычесть 1 день.

Если ваша неделя не начинается в понедельник, но, возможно, в воскресенье (в качестве настройки по умолчанию в США) вам придется соответствующим образом скорректировать вычеты.

Попробуйте это:

SELECT 
DATEADD(
    dd, 
    CASE DATEPART(dw, GETDATE()) 
     WHEN 1 THEN -4 
     WHEN 2 THEN -4 
     ELSE -2 
    END, 
    CONVERT (VARCHAR (10), dateadd(day, 0 ,GETDATE()), 102) 
    ) AS [Two days previous] 
    , 
DATEADD(
    dd, 
    CASE DATEPART(dw, GETDATE()) 
     WHEN 1 THEN -3  
     ELSE -1 
    END, 
    CONVERT (VARCHAR (10), DATEADD(DAY, 0, GETDATE()), 102) 
    ) AS [One day previous] 

Sample SQL Fiddle (с использованием MS SQL, но в связи с этим я считаю, что функционально подобен достаточно Sybase).

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