2013-09-05 13 views
7

मैं SQL सर्वर एक्सप्रेस में समूहीकरण के साथ समस्या हो रही है में DATE द्वारा समूह 2005कैसे केवल स्तंभ datetime

मैं एक DATETIME COLUMN है, लेकिन मैं केवल तिथि के अनुसार यह समूह करना चाहते हैं।

यहाँ मेरी एसक्यूएल कथन:

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 

लेकिन यह मुझे इस त्रुटि दे: अग्रिम में

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.

धन्यवाद।!

+0

विशेष रूप से SQL सर्वर पर, [आप BETWEEN' दिनांक/समय/टाइमस्टैम्प प्रकार के साथ प्रयोग नहीं करना चाहिए '] (http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx)। यह वास्तव में _all_ चर-सटीक मानों (सभी भाषाओं में) पर लागू होता है, लेकिन उस ब्लॉग में SQL सर्वर के विशेष गॉथस पर विवरण है। –

उत्तर

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

+0

मैं पहले से ऐसा ही किया, लेकिन परिणाम अभी भी वही :( – Unknownymous

+0

यह वास्तव में अजीब, 'आदेश को दूर करने के by' देखने के लिए क्या हो रहा है –

+0

यह काम करता है !! मैं' आदेश by' हटाया कोशिश कर रहा है। आप! आप मेरा दिन को बचाने के लिए धन्यवाद ! – Unknownymous

0

कास्टिंग फ़ंक्शन का उपयोग करें तो यह की तरह कुछ हो जाना चाहिए:

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

धन्यवाद, लेकिन यह मुझे इस परिणाम दे: । ** प्रकार तारीख नहीं एक परिभाषित सिस्टम प्रकार ** – Unknownymous

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

यह मुझे इस परिणाम दे रहा है: ** प्रकार DATE के एक परिभाषित प्रणाली प्रकार नहीं है ** – Unknownymous

+0

जो एसक्यूएल सर्वर vresion आप ?? – Dhaval

+0

** एसक्यूएल सर्वर एक्सप्रेस 2005 का उपयोग कर रहे हैं। ** – Unknownymous

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

प्रतिक्रिया के लिए धन्यवाद लेकिन फिर भी यह मुझे एक ही परिणाम देता है। – Unknownymous

संबंधित मुद्दे