T-SQL选择每日总计,但每日截止时间不是午夜
我需要数一数销售数量,并简单地按日期计算销售总额。但是曲线音高是-我需要的“截止时间”是下午6点而不是午夜 前一天下午6点到第二天下午6点 让我感到困惑的是“分组”。我的计数只提取真实日期,而不是“下午6点”信息 查询: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
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