计算出生日期SQL DB2并指出错误数据

计算出生日期SQL DB2并指出错误数据,sql,db2,subquery,Sql,Db2,Subquery,我正在计算学生入学时的年龄。我尝试过这个查询,但在某些情况下,我有录取日期早于他们出生日期的不良数据 例如: date of birth is 2016-10-22-00.00.00.000000 admission date is 2016-09-09-14.51.00.000000 我得到了0,但我应该得到-负数,所以我可以看出这是坏数据。多谢各位 SELECT * FROM (SELECT student_id, Timestampdiff(25

我正在计算学生入学时的年龄。我尝试过这个查询,但在某些情况下,我有录取日期早于他们出生日期的不良数据

例如:

date of birth is 2016-10-22-00.00.00.000000 
admission date is 2016-09-09-14.51.00.000000 
我得到了0,但我应该得到-负数,所以我可以看出这是坏数据。多谢各位

SELECT * 
FROM   (SELECT student_id, 
               Timestampdiff(256, Char(Timestamp(admission_date) - 
                                       Timestamp(date_of_birth))) 
               AS Admission_DOB 
        FROM   person) AS a 
WHERE  admission_dob <= '10' 

您应该将其作为单独的问题来解决。一个用于计算年龄,另一个用于查找不良数据

因此,查找坏数据应该更简单,如:

SELECT *, 'good data', age(start, end) as age
FROM  person
WHERE admission_date > date_of_birth

UNION ALL

SELECT *, 'bad data', null as age -- or age(end, start)
FROM  person
WHERE admission_date < date_of_birth

您应该将其作为单独的问题来解决。一个用于计算年龄,另一个用于查找不良数据

因此,查找坏数据应该更简单,如:

SELECT *, 'good data', age(start, end) as age
FROM  person
WHERE admission_date > date_of_birth

UNION ALL

SELECT *, 'bad data', null as age -- or age(end, start)
FROM  person
WHERE admission_date < date_of_birth


我会用一个案例来说明为什么要将时间戳差异转换为字符?出生日期和入院日期的数据类型是时间戳。如果有更好的方法,请共享它。我在某处找到了这个查询来计算年龄。我不熟悉db2。但是,如果您的字段已经是TIMESTAMP或comvert,则不应使用TIMESTAMP来对结果进行字符化。我会使用case语句。为什么将时间戳差异转换为字符?出生日期和入院日期的数据类型是TIMESTAMP。如果有更好的方法,请共享它。我在某处找到了这个查询来计算年龄。我不熟悉db2。但是如果您的字段已经是TIMESTAMP或comvert,则不应使用TIMESTAMP来对结果进行字符化谢谢您的帮助。但我需要在一个查询中使用它,这样我就可以向我的客户提供一份报告。如果您使用union all呢?查看我的编辑,了解大致思路…年龄是计算年龄的函数谢谢你。我找到了解决这个问题的方法。贴出我的答案。谢谢你的帮助。但我需要在一个查询中使用它,这样我就可以向我的客户提供一份报告。如果您使用union all呢?查看我的编辑,了解大致思路…年龄是计算年龄的函数谢谢你。我找到了解决这个问题的方法。贴出我的答案。我只是贴出对我有帮助的答案。谢谢您的帮助。@user470091-这与本网站的精神不太相符-您发布了一个无法回答的问题,然后窃取了我的代码,并用只有您知道的信息修改了它来回答您的问题。似乎我回答了你的问题-你不觉得吗?你的回答帮助了我,但仍然给了0而不是任何负数,这样我可以很容易地看到结果。我只是发布了对我有帮助的答案。谢谢您的帮助。@user470091-这与本网站的精神不太相符-您发布了一个无法回答的问题,然后窃取了我的代码,并用只有您知道的信息修改了它来回答您的问题。似乎我回答了你的问题-你不觉得吗?你的回答帮助了我,但仍然给了0而不是任何负数,这样我可以很容易地在结果中看到。若要将文本格式化为代码,请选择文本并按ctrl-k键,或在每行前添加4个空格若要格式化为代码,请选择文本并在每行前按ctrl-k键或添加4个空格
SELECT * 
FROM   (SELECT student_id,  
               CASE WHEN  ar.DT_ACCESS_RCVD <  p.DT_BRTH 
                    THEN '-9' 
                    ELSE  Timestampdiff(256, Char(Timestamp(admission_date) - 
                                                  Timestamp(date_of_birth))) 
               END AS Admission_DOB 
        FROM   person) AS a 
WHERE  admission_dob <= '10'