我正在使用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
答案 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) )