仅选择营业日查询错误

时间:2014-09-16 18:59:55

标签: sql sybase sybase-ase

我对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)))

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

我想也许你的逻辑有点瑕疵(可能不必要地复杂)。

我测试了这个(周一为set datefirst 1作为一周的第一天),它返回了周一到周五的正确日期。

逻辑说如果星期一或星期二(所以星期一 - >星期四和星期二 - >星期五)扣除4天,否则2日为最早的日期,如果星期一为第二个,则扣除3天(所以星期一 - >周五)否则扣除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相似)。