我在使用SQL Server Express 2005进行分组时遇到问题
我有一个DATETIME COLUMN
,但我只想按日期对其进行分组。
这是我的SQL语句:
SELECT (u.FirstName + ' ' + u.LastName) AS [FullName],d.user_id,CONVERT(varchar,d.log_date,101) AS log_date, min(d.login_time) as LOG_IN, max(d.logout_time) as LOG_OUT, sum(d.totaltime) as TOTHrs
FROM tbldtr d INNER JOIN tblUsers u ON d.user_id = u.User_Id
WHERE d.user_id = 'ADMIN1' and d.log_date BETWEEN '6/1/2013' AND '6/15/2013'
GROUP BY DATEADD(day, DATEDIFF(day, 0, log_date), 0),u.FirstName,u.LastName,d.user_id order by d.log_date asc
但它给了我这个错误:
列'tbldtr.log_date'在选择列表中无效,因为它不包含在聚合函数或GROUP BY中 子句。
提前致谢。
答案 0 :(得分:5)
将convert(varchar,d.log_date,101)
移至group by
子句:
select
u.FirstName + ' ' + u.LastName as [FullName],
d.user_id,
convert(varchar, d.log_date, 101) as log_date,
min(d.login_time) as LOG_IN,
max(d.logout_time) as LOG_OUT,
sum(d.totaltime) as TOTHrs
from tbldtr d
inner join tblUsers u on d.user_id = u.User_Id
where d.user_id = 'ADMIN1' and d.log_date between '20130601' AND '20130615'
group by
convert(varchar, d.log_date, 101),
u.FirstName, u.LastName, d.user_id
order by log_date asc
此外,将where
中的日期更改为明确格式更为安全 - YYYYMMDD
答案 1 :(得分:0)
使用强制转换功能,它应该像:
GROUP BY CAST(d.log_date AS DATE)
答案 2 :(得分:0)
如果您在组中移动convert(varchar,d.log_date,101)
,则结果将不正确,因为它将计算日期和时间,因此当您在同一日期有不同时间的多个条目时,它会在结果中显示两次。
试试这个会起作用
SELECT ( u.firstname + ' ' + u.lastname ) AS [FullName],
d.user_id,
CONVERT(VARCHAR, cast(d.log_date as DATE) , 101) AS log_date,
Min(d.login_time) AS LOG_IN,
Max(d.logout_time) AS LOG_OUT,
Sum(d.totaltime) AS TOTHrs
FROM tbldtr d
INNER JOIN tblusers u
ON d.user_id = u.user_id
WHERE d.user_id = 'ADMIN1'
AND d.log_date BETWEEN '6/1/2013' AND '6/15/2013'
GROUP BY cast(d.log_date as DATE),
u.firstname,
u.lastname,
d.user_id
ORDER BY d.log_date ASC
答案 3 :(得分:0)
尝试使用以下内容:
SELECT (u.FirstName + ' ' + u.LastName) AS [FullName],d.user_id,CONVERT(varchar,d.log_date,101) AS log_date, min(d.login_time) as LOG_IN, max(d.logout_time) as LOG_OUT, sum(d.totaltime) as TOTHrs
FROM tbldtr d INNER JOIN tblUsers u ON d.user_id = u.User_Id
WHERE d.user_id = 'ADMIN1' and d.log_date BETWEEN '6/1/2013' AND '6/15/2013'
GROUP BY (u.FirstName + ' ' + u.LastName), d.user_id, CONVERT(varchar,d.log_date,101)
order by d.log_date asc