新手在工作!我正在尝试创建一个简单的摘要,通过1)日期和2)小时来计算客户访问和组的数量,但输出如下:
Date Day of Wk Hour #visits
8/12/2013 Monday 0 5
8/12/2013 Monday 1 7
8/12/2013 Monday 6 10
8/13/2013 Tuesday 14 25
8/13/2013 Tuesday 16 4我们是在军事时间,所以14点=下午2点
Select
TPM300_PAT_VISIT.adm_ts as [Date]
,TPM300_PAT_VISIT.adm_ts as [Day of Week]
,TPM300_PAT_VISIT.adm_ts as [Hour]
,count(TPM300_PAT_VISIT.vst_ext_id) as [Total Visits]
From
TPM300_PAT_VISIT
Where
TPM300_PAT_VISIT.adm_srv_cd='22126'
and TPM300_PAT_VISIT.adm_ts between '07-01-2013' and '08-01-2013'
Group by
cast(TPM300_PAT_VISIT.adm_ts as DATE)
,datepart(weekday,TPM300_PAT_VISIT.adm_ts)
,datepart(hour,TPM300_PAT_VISIT.adm_ts)
Order by
CAST(TPM300_PAT_VISIT.adm_ts as DATE)
,DATEPART(hour,TPM300_PAT_VISIT.adm_ts)发布于 2013-08-14 14:12:49
这应该可以解决问题:
; With Streamlined as (
SELECT
DATEADD(hour,DATEDIFF(hour,'20010101',adm_ts),'20010101') as RoundedTime,
vst_ext_id
from
TPM300_PAT_VISIT
where
adm_srv_cd='22126' and
adm_ts >= '20130701' and
adm_ts < '20130801'
)
Select
CONVERT(date,RoundedTime) as [Date],
DATEPART(weekday,RoundedTime) as [Day of Week],
DATEPART(hour,RoundedTime) as [Hour],
count(vst_ext_id) as [Total Visits]
From
Streamlined
Group by
RoundedTime
Order by
CONVERT(date,RoundedTime),
DATEPART(hour,RoundedTime)在CTE (Streamlined)的选择列表中,我们使用DATEADD/DATEDIFF将每个adm_ts值精确到最接近的小时,这使得后续的分组更容易指定。
我们还为datetime比较指定了一个半开放的间隔,这确保我们包括7月份的所有内容(包括在23:59:59.997发生的事件),同时排除在8月1日午夜发生的事件。在处理连续数据(浮点数、日期时间等)时,这通常是正确的比较类型,但这意味着您必须放弃BETWEEN。
我还将日期指定为YYYYMMDD,这是一种安全、明确的格式。您的原始查询可能会被解释为1月7日至1月8日或7月1日至8月1日,具体取决于您用于连接到SQL Server的帐户的设置。更好的是,如果这些日期是由其他(非SQL)代码提供的,那么首先将它们作为datetime传递,以避免任何格式化问题。
https://stackoverflow.com/questions/18212181
复制相似问题