2013-09-05 14 views
7

Sto avendo un problema con il raggruppamento in SQL Server Express 2005Come gruppo da oggi solo nella colonna datetime

Ho un DATETIME COLUMN ma voglio gruppo solo per data.

Qui il mio SQL Statement:

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 

ma mi dà questo errore:

Column 'tbldtr.log_date' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Grazie in anticipo.!

+0

Soprattutto su SQL Server, [si dovrebbe non usare 'BETWEEN' con i tipi di data/ora/timestamp] (http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx). Questo in realtà si applica a tutti i valori di precisione variabile (in tutte le lingue), ma quel blog ha dettagli sui trucchi specifici di SQL Server. –

risposta

5

Basta muovere convert(varchar,d.log_date,101) in group by clausola:

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 

Inoltre, è più sicuro di cambiare le date nel where in formato inequivocabile - YYYYMMDD

+0

l'ho già fatto ma il risultato è sempre lo stesso :( – Unknownymous

+0

è davvero strano, prova a rimuovere 'order by' per vedere cosa sta succedendo –

+0

funziona !! Ho rimosso il' order by'. Grazie! ! – Unknownymous

0

utilizzare la funzione di fusione e quindi dovrebbe diventare qualcosa di simile:

GROUP BY CAST(d.log_date AS DATE) 
+0

grazie ma mi dà questo risultato: ** Tipo DATE non è un tipo di sistema definito. ** – Unknownymous

0

se si sposta convert(varchar,d.log_date,101) in gr a quel punto il risultato non sarà corretto in quanto conterrà sia la data che l'ora in modo tale che quando si avrà più di una voce nella stessa data con un orario diverso mostrerà due volte il risultato.

provare questo funzionerà

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 
+0

mi dà questo risultato: ** Tipo DATE non è un tipo di sistema definito. ** – Unknownymous

+0

quale versione di SQL Server stai usando ?? – Dhaval

+0

** SQL Server Express 2005 ** – Unknownymous

0

provare a utilizzare il seguente:

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 
+0

Grazie per la risposta, ma ancora mi dà lo stesso risultato. – Unknownymous