TSQL计算每天发生的次数

时间:2011-06-13 17:03:53

标签: sql

我有一张表格,可以将访客注册到网站。我想算一下每天有多少人访问过我的网站。

Column of different datetime values

我的问题是我无法弄清楚如何对日期时间值进行类型转换,以便在进行明确计数时不会使用整个日期字段。

任何人都能解释一下吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

我会使用Group By方法(已经作为@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) 
  • 在这些情况下,将DateTime转换为日期会有所帮助。
  • 这不如@Erik的解决方案效率高;但是,学习这个方法是一个好主意,因为你可以用OverPartition By做一些你不能用Group By做的事情(至少,没有效率)。话虽如此,这对你的情况来说可能有点过分了。