【发布时间】:2014-10-29 15:56:55
【问题描述】:
使用:SQL Server 2008 R2
是否有可能在不使用 CTE 的情况下获取最早和最新的记录,然后在单个 SELECT 语句中获取 (DATEDIFF) 之间的天数?
为了澄清,这是我当前的 SELECT 语句:
SELECT
COUNT(*) as 'Sessions',
MAX(f_sessiondate) AS 'Latest',
MIN(f_sessiondate) as 'Oldest'
所以,假设我得到以下结果
Sessions Latest Oldest
2610 2014-10-28 00:00:00.000 2013-12-23 00:00:00.000
我想要的是通过在“最新”和“最旧”条目之间进行 DATEDIFF 来获得“每天的平均会话数”。因此,“天数”为 309,“每天平均会话数”为 8.45(四舍五入)。
编辑:
幸运的是,我得到了它在某种程度上的工作,虽然我错过了我的小数点。这是我添加的内容:
CAST(COUNT(*) / DATEDIFF(day, MIN(f_sessiondate),MAX(f_sessiondate)) as DECIMAL(18,2)) as 'Average Sessions Fixed',
根据上面的(更新的)数字,我应该收到 8.44(309 天)的结果。但是,SQL 给了我 8.00 的结果。我怎样才能得到正确的小数?
提前致谢,
比姆斯
【问题讨论】:
-
您应该将 count(*) 转换为小数。
-
CAST(cast(COUNT(*) as decimal) / DATEDIFF.....)
-
做到了,谢谢。您能否将其作为官方答案发布,以便我标记它?
-
我认为您应该在 DATEDIFF() 的结果中添加 1,因为您示例中的会话发生在两个不同的日期。同样,如果 MIN(f_sessiondate) = MAX(f_sessiondate),您将得到除以零的错误。如果可以的话,最好保存完整的时间戳,以小时为单位除以 24。
-
当然,尽管您似乎大多回答了自己的问题。
标签: sql sql-server