2011-06-13 26 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来处理您无法通过分组方式(至少不是有效)执行的操作。这就是说,这可能是你的情况矫枉过正。