Sql server 2005 试图从出生日期开始计算年龄

Sql server 2005 试图从出生日期开始计算年龄,sql-server-2005,Sql Server 2005,我明白了 Msg 8115,16级,状态2,第2行 算术溢出错误转换 将表达式转换为数据类型datetime 有什么解决办法吗?我想你的问题就在这里dateadd(year,datediff(year,dau FODELSEAR,getdate()),dau FODELSEAR)。您的DA_FODELSEAR中有一个值不是DATETIME格式。我会运行一个SELECT语句来查找有问题的值。您正在检查NULL但空白区域如何?您必须确保DA\u FODELSEAR的日期时间格式正确。您可以使用CAS

我明白了

Msg 8115,16级,状态2,第2行 算术溢出错误转换 将表达式转换为数据类型datetime


有什么解决办法吗?

我想你的问题就在这里
dateadd(year,datediff(year,dau FODELSEAR,getdate()),dau FODELSEAR)
。您的
DA_FODELSEAR
中有一个值不是
DATETIME
格式。我会运行一个
SELECT
语句来查找有问题的值。您正在检查
NULL
但空白区域如何?

您必须确保
DA\u FODELSEAR
的日期时间格式正确。您可以使用
CAST(dau FODELSEAR作为DATETIME)
进行检查。

我只是想知道为什么要使用case。试试下面的方法,看看是否有效

SELECT [ID_KUNDNR]
      ,CASE
       WHEN DA_FODELSEAR IS NULL THEN 0
       WHEN dateadd(year, datediff (year, DA_FODELSEAR, getdate()), DA_FODELSEAR) > getdate() THEN datediff (year, DA_FODELSEAR, getdate()) - 1
       ELSE datediff (year, DA_FODELSEAR, getdate())
       END As Age
      ,[Catalog]
  FROM Table
但是,您确定DA_FODELSEAR的所有值都可以转换为datetime吗

如果你有困难,试试这个

 SELECT [ID_KUNDNR] ,
    datediff (year, 0, (getdate()-DA_FODELSEAR)) as Age,
    Catalog
    From Table

如果您想知道是哪些行导致了此转换问题,请选择带有的表,其中IsDATE(DA_FODELSEAR)=0'

我刚刚做了这件事。并得到相同的错误。不过,DA_FODELSEAR是一个整数。对不起。DA_FODELSEAR是nvarchar@vovkjn-hmm好的,我想是这样的。nvarchar是有道理的。该列中的某些数据的日期时间格式不正确,这导致了此错误。@vovkjn-您必须从Datu FODELSEAR列中删除所有不采用日期时间格式的数据。Dau FODELSEAR是nvarchar类型。我理解,但选择Datediff(年份,0,(getdate()-'1980-01-45')失败。或者可能是数据库中存储的日期格式有问题。您在DA中使用的格式是什么_FODELSEAR@vovkjn:此外,
datetime
可以保存不早于
1753-01-01
且不晚于
9999-12-31
的日期。如果您还没有这样做,您需要确保
DA_FODELSEAR
不包含超出这些界限的任何日期。太棒了!例如“当ISDATE(DA_FODELSEAR)=0,然后0 Else datediff(year,0,(getdate()-DA_FODELSEAR))作为年龄结束”谢谢。。。但请注意,无效日期的年龄为0。有些值如0000。@vovkjn:这将是问题的原因之一。如果不需要它们,我建议
null
将它们去掉。@vovkjn:请在左边的空勾上打勾,作为帮助他人的答案。
 SELECT [ID_KUNDNR] ,
    Case When ISDATE(DA_FODELSEAR) = 0 Then 0 Else
        datediff (year, 0, (getdate()-DA_FODELSEAR)) 
        End as Age,
    Catalog
    From Table