Sql 从两个变量生成年龄时,将表达式转换为数据类型时出现算术溢出错误

Sql 从两个变量生成年龄时,将表达式转换为数据类型时出现算术溢出错误,sql,sql-server,Sql,Sql Server,我试图从两个表中提取数据,首先生成数据库中每个人的注册年数,然后连接到另一个表以限制年龄组,目的是获得标准中所有人的注册总年数。我当前收到了错误消息 “将表达式转换为数据类型时出现算术溢出错误” obsdate变量是'YYYY-DD-MM'日期格式,而yob是'yyy'smallint,但我认为使用YEARobsdate已经解决了这个问题,问题可能在别处 我看到添加了“CASTsubquery.yearsreg AS BIGINT”,这给了我一个远高于预期的数字,我不确定它是否达到了我的期望 S

我试图从两个表中提取数据,首先生成数据库中每个人的注册年数,然后连接到另一个表以限制年龄组,目的是获得标准中所有人的注册总年数。我当前收到了错误消息

“将表达式转换为数据类型时出现算术溢出错误”

obsdate变量是'YYYY-DD-MM'日期格式,而yob是'yyy'smallint,但我认为使用YEARobsdate已经解决了这个问题,问题可能在别处

我看到添加了“CASTsubquery.yearsreg AS BIGINT”,这给了我一个远高于预期的数字,我不确定它是否达到了我的期望

SELECT SUM(subquery.yearsreg)
FROM (
    SELECT id, yob,
        (CASE
        WHEN pat.deathdate IS NOT NULL AND pat.deathdate <= pat.regenddate THEN (YEAR(pat.deathdate)-YEAR(pat.regstartdate))
        WHEN pat.deathdate IS NOT NULL AND pat.deathdate > pat.regenddate THEN (YEAR(pat.regenddate)-YEAR(pat.regstartdate))
        WHEN pat.deathdate IS NULL AND pat.regenddate IS NOT NULL THEN (YEAR(pat.regenddate)-YEAR(pat.regstartdate))
        ELSE YEAR(getdate())-YEAR(pat.regstartdate)
        END) AS yearsreg
    FROM Patient AS pat
) AS subquery
INNER JOIN Observation AS obs ON subquery.id = obs.id
WHERE obs.obsdate > '2004-12-31' AND obs.obsdate <= '2018-12-31'
    AND ((YEAR(obs.obsdate))-subquery.yob) > 15 AND ((YEAR(obs.obsdate))-subquery.yob) < 45
试试这个:

SELECT SUM(subquery.yearsreg)
FROM (
  SELECT id, CONVERT(INT,yob),
    (CASE
      WHEN pat.deathdate IS NOT NULL AND pat.deathdate <= pat.regenddate THEN (YEAR(pat.deathdate)-YEAR(pat.regstartdate))
      WHEN pat.deathdate IS NOT NULL AND pat.deathdate > pat.regenddate THEN (YEAR(pat.regenddate)-YEAR(pat.regstartdate))
      WHEN pat.deathdate IS NULL AND pat.regenddate IS NOT NULL THEN (YEAR(pat.regenddate)-YEAR(pat.regstartdate))
      ELSE YEAR(getdate())-YEAR(pat.regstartdate)
    END) AS yearsreg
  FROM Patient AS pat
  WHERE pat.yob IS NOT NULL AND pat.regstartdate IS NOT NULL
) AS subquery
INNER JOIN Observation AS obs ON subquery.id = obs.id
WHERE obs.obsdate > '2004-12-31' AND obs.obsdate <= '2018-12-31'
  AND ((YEAR(obs.obsdate))-subquery.yob) > 15 AND ((YEAR(obs.obsdate))-subquery.yob) < 45
尝试将yob转换为int,只是为了它,只是为了防止某些类型的冲突情况。 YEAR转换为int,应该由它决定结果的大小,但您永远不知道。。 regstartdate也可以为空,我认为年份将在1900年转换它。我现在没有SQLServer可供试用。
试着运行几个查询,看看是否有用户插入了疯狂的日期,比如12-31-9999或01-01-1753,显然datetime走得那么远

什么是表模式?你能给我们提供一些样本数据和预期结果吗?欢迎来到Stack Overflow,Katie。为了帮助我们帮助您,请阅读下面的内容。看看这个,然后是您的问题以及创建所需的详细信息。您是否检查过yob字段是否有任何空值,并最终将其从查询中排除?yob的数据类型?@DaleK抱歉,我使用的是SQL Server。感谢帮助@devtech不幸地仍然给出了相同的错误。我明白了,那么到错误必须在别处我正在编辑答案