基于当天的查询条件(sat / sun应该返回星期五的值)

时间:2018-06-08 19:03:11

标签: sql sql-server-2008

我正试图弄清楚如何在整个星期内返回每日结果,同时保持周末的结果在周末可见。我目前的代码没有做到这一点 - 我不得不搞乱阵列吗?

SELECT     ROUND(COUNT(ClosedDate) / 10, 0) * 10 [Previous Day Sales]
FROM         PartsSales
WHERE     (MONTH(ClosedDate) = MONTH(GETDATE())) AND (YEAR(ClosedDate) =     YEAR(GETDATE())) AND (DAY(ClosedDate) = **case** DAY(GETDATE()) 
when 1 then 1 
when 2 then 2
when 3 then 3
when 4 then 4
when 5 then 5
when 6 then 5
when 7 then 5 end

1 个答案:

答案 0 :(得分:2)

您可以使用datepart查找当周的当天(1 =星期日,2 =星期一等),然后您可以使用dateadd返回星期五&#39}日期。如果您将getdate()转换为日期,那么您将始终拥有"午夜"在那一天的开始。

dateadd(
    day,
    case datepart(dw, getdate())
        when 1 then -- Sunday
            -2
        when 7 then -- Saturday
            -1
        else        -- Any other day
            0
    end,
    convert(date, getdate())
)

您的ClosedDate是datetime数据类型吗?您可以通过检查日期范围来更好地使用索引,而不是将日期部分拉出(使用year / month / day)。下面是where子句中包含大量重用代码的示例。当然,如果它只是一个日期数据类型,你甚至不需要一个范围,因为你正在计算日期。

以下是一个例子。如果您使用变量(如果您将其构建到存储过程中)或者可能是派生/ CTE表,那会更好。为了清楚起见,我把事情弄得很冗长。

SELECT     
    ROUND(COUNT(ClosedDate) / 10, 0) * 10 [Previous Day Sales]
FROM         
    PartsSales
WHERE
    ClosedDate between 
        -- Today/Friday's date:
        dateadd(
            day,
            case datepart(dw, getdate())
                when 1 then -- Sunday
                    -2
                when 7 then -- Saturday
                    -1
                else        -- Any other day
                    0
            end,
            convert(date, getdate())
        )
        and
        -- Add 1 day to the "Today/Friday" date. 
        -- This is the same logic as above, except wrapped in an extra dateadd to add 1 day to it.
        dateadd(
            day,
            1,
            dateadd(
                day,
                case datepart(dw, getdate())
                    when 1 then -- Sunday
                        -2
                    when 7 then -- Saturday
                        -1
                    else        -- Any other day
                        0
                end,
                convert(date, getdate())
            )
        )