0

新手在工作!我正在尝试创建一个简单的摘要,按 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:00 pm

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)
4

1 回答 1

0

这应该可以解决问题:

; 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每个值下限adm_ts到最接近的小时。这使得后续分组更容易指定。DATEADDDATEDIFF

我们还为日期时间比较指定了一个半开放间隔,以确保我们包括7 月份的所有内容(包括 23:59:59.997 发生的事情),同时排除 8 月 1 日午夜发生的事件。这通常是处理连续数据(浮点数、日期时间等)时使用的正确比较类型,但这意味着您必须放弃BETWEEN.

我还将日期指定YYYYMMDD为一种安全、明确的格式。您的原始查询可能被解释为 1 月 7 日 - 1 月 8 日或 7 月 1 日 - 8 月 1 日,具体取决于您用于连接 SQL Server 的任何帐户的设置。更好的是,如果这些日期是由其他一些(非 SQL)代码提供的,那么首先将它们作为datetimes 传递,以避免任何格式问题。

于 2013-08-14T06:12:49.367 回答