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