SQL:当日期格式为DATETIME时,我可以强制查询按计算的周末日期进行分组吗?

时间:2017-09-15 12:33:51

标签: sql-server sql-server-2008 tsql datetime

我正在使用SQL 2008 R2。

我正在尝试编写一个查询来汇总考试总数,并在表格中按周结束日期显示总数,如下所示:

Week Ending | CT  | MRI | Ultrasound
------------+-----+-----+-----------
 10-09-2017 | 109 | 234 |   342
 03-09-2017 | 123 | 654 |   234

我一直在使用以下函数来计算日期变量的周末日期:

SELECT DATEADD(dd, 7-(DATEPART(dw, exam_date)), exam_date) [Week Ending date]

使用此函数,然后在日期变量格式为DATE时通过此函数进行分组,在以前对其他表的查询中一直正常。

然而,我发现查询当前表的问题是因为'exam_date'变量是DATETIME格式,当我尝试按同一语句分组时,它在日期和时间上进行分组(因此有效) ,将每个记录列为单独的行,除非DATETIME变量与毫秒匹配。)

我尝试了几种CASTING的排列,并将exam_date变量转换为105格式,但代码只是错误。我假设我的语法错了。努力包括:

DATEADD(dd, 7-(DATEPART(dw, (CONVERT(DATE, exam_date))exam_date), exam_date) 
DATEADD(dd, 7-(DATEPART(dw, CONVERT (varchar(10),exam_date,105))), exam_date) 

错误:

Msg 241, Level 16, State 1, Line 5
Conversion failed when converting date and/or time from character string.

请问是否有人可以建议是否可以强制查询按DATETIME变量的DATE部分进行分组,若然,我的代码在哪里出错?

作为参考,我正在使用的完整(基本)查询是:

SET DATEFIRST 1;

SELECT 
     DATEADD(dd, 7-(DATEPART(dw, exam_date)), exam_date) [Week Ending date]
    ,SUM(case when modality_name = 'C - CT' then 1 else 0 end) [CT]
    ,SUM(case when modality_name = 'M - MRI' then 1 else 0 end) [MRI]
    ,SUM(case when modality_name = 'U - Ultrasound' then 1 else 0 end) [Ultrasound]


FROM dbo.Diagnostics

WHERE 
        exam_date > '2016-08-27'
    AND GETDATE() > DATEADD(dd, 7-(DATEPART(dw, exam_date)), exam_date)  

GROUP BY 
     DATEADD(dd, 7-(DATEPART(dw, exam_date)), exam_date)

ORDER BY 
     DATEADD(dd, 7-(DATEPART(dw, exam_date)), exam_date) desc

1 个答案:

答案 0 :(得分:1)

转换为日期以摆脱时间:

CONVERT( DATE, DATEADD(dd, 7-(DATEPART(dw, exam_date)), exam_date) ) AS [Week Ending date]

GROUP BY CONVERT( DATE, DATEADD(dd, 7-(DATEPART(dw, exam_date)), exam_date) )

ORDER BY CONVERT( DATE, DATEADD(dd, 7-(DATEPART(dw, exam_date)), exam_date) )