首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要依次按日期、小时、输出日期、文本周几、小时范围进行排序SQL Server2008 R2

需要依次按日期、小时、输出日期、文本周几、小时范围进行排序SQL Server2008 R2
EN

Stack Overflow用户
提问于 2013-08-13 22:42:43
回答 1查看 164关注 0票数 0

新手在工作!我正在尝试创建一个简单的摘要,通过1)日期和2)小时来计算客户访问和组的数量,但输出如下:

代码语言:javascript
复制
 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点

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2013-08-14 14:12:49

这应该可以解决问题:

代码语言:javascript
复制
; 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传递,以避免任何格式化问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18212181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档