2012-06-22 306 views
1

我想轉換:轉換日期爲字符串,將字符串和逆變換爲日期SQL

select convert(nvarchar(16), TimeLog, 120) requestTime, 
     count(Request) As noOfQueries 
from LogData 

where TimeLog between @StartDate and @EndDate 

group by convert(nvarchar(16), TimeLog, 120) order by requestTime; 

在這裏,在where子句中Timelog之間:2012-06-212012-06-21但我想它2012-06-21 00:00:00之間和2012-06-21 23:59:59

因此,我想在@Satrtdate/@EndDate轉換成以上格式,所以我想追加00:00:00@StartDate23:59:59@EndDate

+2

爲nvarchar(16)?你的日期什麼時候會持有Unicode數據? –

+0

@AaronBertrand感謝您的回覆。 select語句無關緊要。請你只能看到where子句。 – Rish

+2

這就是爲什麼它是一個評論,而不是一個答案。 –

回答

6

你想要的是:

SELECT 
    requestDate = CONVERT(CHAR(10), TimeLog, 120), 
    noOfQueries = COUNT(Request) 
WHERE TimeLog >= @StartDate 
AND TimeLog < DATEADD(DAY, 1, @EndDate) 
GROUP BY CONVERT(CHAR(10), TimeLog, 120) 
ORDER BY CONVERT(CHAR(10), TimeLog, 120); 

你不想使用BETWEEN的原因是因爲它的行爲將取決於基礎數據類型而不同。如果它是SMALLDATETIME,那麼您將收集數據並從第二天起獲取數據。如果是DATETIME2,則可能會錯過23:59:59.0000000 and 23:59:59.9999999之間的數據。即使您現在知道數據類型,在您發佈查詢後它可能會發生變化。誰將返回並更正23:59:5923:59:0023:59:59.9999999?在開放式範圍內,選擇在午夜前的下一個之前的所有內容,您將永遠不必擔心。

請給這兩篇文章讀:

http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx

+1

+1 - 我同意(毆打我),但你能否解釋_爲什麼OP應該這樣做? –

+0

我同意。 +1亞倫。 –