Sql server 2005 试图从出生日期开始计算年龄
我明白了 Msg 8115,16级,状态2,第2行 算术溢出错误转换 将表达式转换为数据类型datetimeSql 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
有什么解决办法吗?我想你的问题就在这里
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