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。