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

Sql 基于当天的查询条件(sat/sun应返回星期五的值),sql,sql-server-2008,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 (

我试图找出如何在一周内返回每日结果,同时在周末保持周五的结果可见。我当前的代码没有做到这一点——我必须处理数组吗

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

您可以使用
datepart
查找一周中的当前日期(1=星期日,2=星期一等),然后可以使用
dateadd
返回星期五的日期。如果您将
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是日期时间数据类型吗?通过检查日期范围,您可以更好地使用索引,而不是提取日期部分(使用
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())
            )
        )

非常感谢你的解释。我对SQL还不太熟悉,慢慢消化,所以我会仔细考虑你的建议,并让你知道它们是否对我有用。再次感谢@祝你好运!SQL有一些非常抽象的概念需要你去思考,学习它的最好方法就是不断地弄脏你的手。只是想让你知道代码工作得非常完美,对我来说是一个很好的教训。我总是惊讶于陌生人在这里能如此乐于助人。感谢again@amart47我很高兴它对你有用。听到解决方案有效的反馈总是很好地鼓励陌生人继续帮助他人。:)@amart47这里有一点小信息,因为我看到您将count(*)除以10:在SQL中,当您将一个整数除以一个整数(
count(*)
返回一个int)时,它将返回另一个整数,而不是浮点。这意味着如果运行
选择1/4
,将得到一个结果“0”,因为小数点会被截断。因此,您必须将一个值转换为float。例如:
选择1/convert(float,4)
将返回0.25。