2011-06-13 52 views
2

我有一個表訪問者註冊到一個網站。我想統計每天有多少人訪問過我的網站。TSQL統計每天有多少次事件

Column of different datetime values

我的問題是,我無法弄清楚如何強制轉換的日期時間值,以便作出不同的計數時,它不使用整個日期字段。

任何人都可以解釋這一點嗎?

+0

你正在使用哪些DBMS? – ErikE 2011-06-13 19:19:31

回答

9
SELECT 
    DateWithNoTimePortion = DateAdd(Day, DateDiff(Day, '19000101', DateCol), '19000101'), 
    VisitorCount = Count(*) 
FROM Log 
GROUP BY DateDiff(Day, 0, DateCol); 

由於某種原因,我認爲您使用的是SQL Server。如果不是這樣,請告訴我們。我認爲DateDiff方法可以在其他DBMS中使用,具體取決於它們支持的功能,但它們可能有更好的方法來完成這項工作(例如Oracle中的TRUNC)。

在SQL Server中,上述方法是完成這項工作的最快方法之一。只有兩種更快的方法:

  • 內在intγ變換取整:

    Convert(datetime, Convert(int, DateCol - '12:00:00.003')) 
    
  • 如果使用SQL Server 2008及以上,這是最快的所有的(如果這是你應該使用它你有什麼):

    Convert(date, DateCol) 
    

當SQL Server 2008中不可用,我個墨水我發佈的方法是未來開發人員查看代碼的速度和清晰度的最佳組合,避免做不明確的魔術。你可以see the tests backing up my speed claims

+0

爲什麼dateadd和datediff會起作用,他們在這種情況下做了什麼好處? – 2011-06-13 17:20:52

+0

datediff()計算DateCol值與基準日期之間的天數差異。dateAdd()將該天數添加到基準日期爲0.該計算的結果是DateCol的日期值爲被保留但其時間值被丟棄(或者如果你願意的話,設置爲0),因此不管該字段的時間部分如何,所有具有相同日期的記錄都將被分組在一起。 – Hellion 2011-06-13 17:27:04

+0

aaahhh ....聰明,歡呼聲 – 2011-06-13 17:28:11

3

我會做集團通過方法(已經發布由@Erik答案)

然而,您還可以使用OVER與分配,以實現這一目標。

SELECT 
    DISTINCT CONVERT(Date, VisitDate), 
    COUNT(*) OVER (PARTITION BY CONVERT(Date, VisitDate)) as Visitors -- Convert Datetime to Date 
FROM 
    MyLogTable 
ORDER BY 
    CONVERT(Date, VisitDate) 
  • 它有助於你的時間值轉換到在這些情況下一個日期。
  • 這不像@ Erik的解決方案那樣高效;但是,學習該方法是一個不錯的主意,因爲您可以使用OverPartition By來處理您無法通過分組方式(至少不是有效)執行的操作。這就是說,這可能是你的情況矯枉過正。