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

T-SQL选择每日总计,但每日截止时间不是午夜,sql,tsql,datetime,Sql,Tsql,Datetime,我需要数一数销售数量,并简单地按日期计算销售总额。但是曲线音高是-我需要的“截止时间”是下午6点而不是午夜 前一天下午6点到第二天下午6点 让我感到困惑的是“分组”。我的计数只提取真实日期,而不是“下午6点”信息 查询: SELECT top 30 CONVERT(VARCHAR(8), chickendate, 112) AS varSort30, CONVERT(VARCHAR(10), chickendate, 101) AS varDay30, SUM(CAST(transAmount

我需要数一数销售数量,并简单地按日期计算销售总额。但是曲线音高是-我需要的“截止时间”是下午6点而不是午夜

前一天下午6点到第二天下午6点

让我感到困惑的是“分组”。我的计数只提取真实日期,而不是“下午6点”信息

查询:

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
选择前30位的CONVERT(VARCHAR(8),chickendate,112)作为varSort30,
将(VARCHAR(10),chickendate,101)转换为varDay30,
总金额(以货币形式计算),
将(chickendate)计数为varCounter
来自鸡肉
哪里
(chickendate>=日期添加(小时,18,日期添加(天,日期差异(天,0,chickendate),-1))和
chickendate<日期添加(小时,18,日期添加(天,日期差异(天,0,chickendate),0)))
按转换分组(VARCHAR(8),chickendate,112),
转换(VARCHAR(10),chickendate,101)
按转换顺序(VARCHAR(8),chickendate,112)描述
转圈转圈,我觉得有什么东西正盯着我的脸。谢谢。

那么:

GROUP BY CONVERT(VARCHAR(8), dateadd(hour, 6, chickendate), 112)

因此,
'2012-08-09 18:00:00'
20120810
分组,而
'2012-08-09 17:59:59'
20120809

分组如果我的逻辑正确,这将为您提供正确的结果:

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

如果chickendate是一个日期时间而不仅仅是一个日期,那么您可以使用

GROUP BY CONVERT(VARCHAR(10), DATEADD(hh, 6, chickendate), 101)
将日期提前6小时(比午夜或下午6点提前6小时),然后在一年中的某一天分组。这只适用于存储时间信息的情况,我不确定您是否存储了时间信息。为必要的表发布一些模式。但我想你在找

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

新的“一天”从下午6点开始吗?换句话说,你能定义2012年10月8日的确切开始和结束时间吗?你过滤的是24小时,这给了你两天的时间,但你只是根据天分组,而不在乎时间。我认为您需要添加一个基于时间的计算列,告诉Notes它的第1天或第2天,然后按该时间分组。@Dems我不这么认为,但这是我不确定的部分。如果我阅读正确,则前一天下午6点到第二天下午6点的要求似乎表明是
+6
。否,@Dems-6将在晚上7点进行销售,并在新版本中注册为下午1点。而不是
-6
<代码>-6将下午6点映射到中午,而不是午夜。
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