【问题标题】:How to get a difference between 2 different date datatypes in MS sql?如何在 MS sql 中区分两种不同的日期数据类型?
【发布时间】:2019-06-14 13:39:53
【问题描述】:

所以我有两列 EnrollmentStartDate 和 EligibilityStartDate,我需要得到两者之间的差异(enroll - elibil),然后获取客户从资格日期开始活跃所需的平均天数。

问题是其中一个表中的 EnrollmentStartDate 是 datetime2 格式,而另一个表中的 EligibilityStartDate 是 date 格式。

我收到以下错误

消息 8117,第 16 级,状态 1,第 16 行 操作数数据类型 datetime2 对减法运算符无效。

有没有办法将一个转换成另一个?我该怎么办?

    select clientid, avg(EnrollmentStartDate - EligibilityStartDate) as avg_daysFROM dbo.Client  inner join  dbo.ClientEnrollment ON dbo.Client.ClientId = dbo.ClientEnrollment.ClientId order by avg_days

【问题讨论】:

标签: sql sql-server


【解决方案1】:

DATEDIFF() 应该可以处理这个:

select clientid,
       avg(datediff(day, EligibilityStartDate, EnrollmentStartDate) * 1.0
          )
. . .

* 1.0 是所以平均值不计算为整数。

【讨论】:

    【解决方案2】:
    1. 您不能对 DATE 和 DATETIME2 数据类型。您必须宁愿在 SQL 中使用 DATEDIFF 函数 服务器。
    2. 如果要在 SELECT 中引入任何列并使用聚合函数,则需要 GROUP BY
    3. 另外,建议您在表中使用别名 查询中涉及多个表以提高可读性。

    假设 EnrollmentStartDate 和 EligibilityStartDate 列在 dbo.ClientEnrollment 表中,

    SELECT  C.ClientId
            ,avg_days = AVG(DATEDIFF(DAY, CE.EligibilityStartDate, CE.EnrollmentStartDate)) 
    FROM    dbo.Client C
            INNER JOIN  dbo.ClientEnrollment CE
                ON C.ClientId = CE.ClientId 
    GROUP   BY C.ClientId           
    ORDER   BY avg_days
    

    【讨论】:

      猜你喜欢
      • 2023-01-24
      • 1970-01-01
      • 2020-01-08
      • 2020-02-23
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      • 2018-07-03
      • 1970-01-01
      相关资源
      最近更新 更多