【问题标题】:SQL - Collect Oldest and Latest Records, and Get Days BetweenSQL - 收集最旧和最新记录,并获取间隔天数
【发布时间】: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


【解决方案1】:

默认情况下,计数是整数,任何数学运算都会产生整数。要生成小数,请先将 count(*) 转换为小数,然后再执行操作。

CAST(CAST(COUNT(*) as Decimal) / DATEDIFF(day, MIN(f_sessiondate),MAX(f_sessiondate)) as DECIMAL(18,2)) as 'Average Sessions Fixed',

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多