我有一张表格,可以将访客注册到网站。我想算一下每天有多少人访问过我的网站。
我的问题是我无法弄清楚如何对日期时间值进行类型转换,以便在进行明确计数时不会使用整个日期字段。
任何人都能解释一下吗?
答案 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)
Over
和Partition By
做一些你不能用Group By做的事情(至少,没有效率)。话虽如此,这对你的情况来说可能有点过分了。