[英]T-SQL select daily totals BUT daily cut off is not midnight
I need to count number of sales, and sum the totals of sales by date, easy. 我需要计算销售数量,并按日期总计销售总额,这很容易。 But the curve pitch is - I need the "cut off" to be 6pm not midnight.
但曲线间距是 - 我需要“截止”为下午6点而不是午夜。
6pm the day before until 6pm day of.
前一天下午6点至下午6点。
What's throwing me is "grouping". 扔我的是“分组”。 My counts are only pulling only the true date not "6pm" info.
我的计数只是拉动真实日期而不是“下午6点”信息。
Sort30 Day30 Total Counter
-------- ---------- --------------------- -----------
20120810 08/10/2012 675.32 9
20120809 08/09/2012 1314.68 16
Query: 查询:
SELECT top 30 CONVERT(VARCHAR(8), chickendate, 112) AS varSort30,
CONVERT(VARCHAR(10), chickendate, 101) AS varDay30,
SUM(CAST(transAmount AS money)) AS varTotal,
Count(chickendate) AS varCounter
FROM CHICKEN
WHERE
(chickendate >= dateadd(hour, 18, dateadd(day, datediff(day, 0, chickendate), -1)) AND
chickendate < dateadd(hour, 18, dateadd(day, datediff(day, 0, chickendate), 0)))
GROUP BY CONVERT(VARCHAR(8), chickendate, 112),
CONVERT(VARCHAR(10), chickendate, 101)
ORDER BY CONVERT(VARCHAR(8), chickendate, 112) DESC
Going round and round, I feel its something staring me in the face. 四处走动,我觉得它的某些东西盯着我的脸。 Thanks.
谢谢。
If my logic is correct, this should give you the correct results: 如果我的逻辑是正确的,这应该给你正确的结果:
SELECT TOP 30
CONVERT(VARCHAR(8), modifiedChickenDate, 112) AS varSort30,
CONVERT(VARCHAR(10), modifiedChickenDate, 101) AS varDay30,
SUM(CAST(transAmount AS money)) AS varTotal,
COUNT(modifiedChickenDate) AS varCounter
FROM (
SELECT
transAmount,
DATEADD(HOUR, 6, chickendate) AS modifiedChickenDate
FROM CHICKEN
) sub
GROUP BY
CONVERT(VARCHAR(8), modifiedChickenDate, 112) AS varSort30,
CONVERT(VARCHAR(10), modifiedChickenDate, 101) AS varDay30,
ORDER BY
CONVERT(VARCHAR(8), modifiedChickenDate, 112) AS varSort30
If chickendate is a DATETIME instead of just a DATE, then you can use 如果chickendate是DATETIME而不是DATE,那么你可以使用
GROUP BY CONVERT(VARCHAR(10), DATEADD(hh, 6, chickendate), 101)
to advance the date 6 hours (making your cutoff 6 hours earlier than midnight, or 6pm), then group on the Day of year. 提前6小时(截止时间比午夜提前6小时,或下午6点),然后在一年中的一天进行分组。 This only works if you're storing time information, which I'm not sure you are.
这只适用于您存储时间信息的情况,我不确定您是谁。 Post some schema for the necessary tables.
为必要的表发布一些模式。 But I think you're looking for...
但我认为你在寻找......
SELECT TOP 30 CONVERT(VARCHAR(10), DATEADD(hh, 6, chickendate), 101) as Date
, SUM(CAST(transAmount as money)) AS Total
, Count(*) as Counter
FROM Chicken
GROUP BY CONVERT(VARCHAR(10), DATEADD(hh, 6, chickendate), 101)
ORDER BY CONVERT(VARCHAR(10), DATEADD(hh, 6, chickendate), 101) DESC
How about: 怎么样:
GROUP BY CONVERT(VARCHAR(8), dateadd(hour, 6, chickendate), 112)
So '2012-08-09 18:00:00'
is grouped by 20120810
, and '2012-08-09 17:59:59'
is grouped by 20120809
. 所以
'2012-08-09 18:00:00'
按20120810
分组, '2012-08-09 17:59:59'
按20120809
分组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.