简体   繁体   English

T-SQL选择每日总计但每天截止不是午夜

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM