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