Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server 2008中向变量添加函数_Sql_Sql Server_Variables - Fatal编程技术网

在SQL Server 2008中向变量添加函数

在SQL Server 2008中向变量添加函数,sql,sql-server,variables,Sql,Sql Server,Variables,我在使用变量存储函数时遇到了麻烦。我想将以下函数存储在变量中: declare @agegroup int set @agegroup = datediff(year, convert(date, p.date_of_birth), getdate()) 这样做会产生一个错误: Msg 241, Level 16, State 1, Line 3 Conversion failed when converting date and/or time from character string.

我在使用变量存储函数时遇到了麻烦。我想将以下函数存储在变量中:

declare @agegroup int
set @agegroup = datediff(year, convert(date, p.date_of_birth), getdate())
这样做会产生一个错误:

Msg 241, Level 16, State 1, Line 3
Conversion failed when converting date and/or time from character string.
我相信这是因为SQL还不知道出生日期。它是查询表中的一列

select p.date_of_birth from person p
一旦查询完成,我需要多次引用变量中的函数,所以我想使用变量来整理查询。这可能吗

编辑:我被要求在示例代码中包含该字段的一些数据。DOB存储为字符串:yyyymmdd

19350919
19370607
19370607
19400814
19410128
19410128

首先,我假设您的代码脱离了上下文,因为没有定义p。没关系

您的问题是出生日期存储为字符串。通过将其存储为日期来解决该问题。SQL数据库具有日期/时间类型是有原因的。使用它们

您可以使用try\u convert消除代码中的错误:

在SQL Server 2008中,合理的近似值为:

set @agegroup = datediff(year, (case when isdate(p.date_of_birth) = 1 then p.date_of_birth end), getdate())
您可以通过执行以下操作来识别有问题的值:

select date_of_birth
from p
where try_convert(date, date_of_birth) is null and date_of_birth is not null;

首先,我假设您的代码脱离了上下文,因为没有定义p。没关系

您的问题是出生日期存储为字符串。通过将其存储为日期来解决该问题。SQL数据库具有日期/时间类型是有原因的。使用它们

您可以使用try\u convert消除代码中的错误:

在SQL Server 2008中,合理的近似值为:

set @agegroup = datediff(year, (case when isdate(p.date_of_birth) = 1 then p.date_of_birth end), getdate())
您可以通过执行以下操作来识别有问题的值:

select date_of_birth
from p
where try_convert(date, date_of_birth) is null and date_of_birth is not null;

不,之所以会发生这种情况,是因为您将日期存储为字符串(No-No),然后尝试将其转换为日期。格式无效。为什么出生日期不已经是日期?设置@agegroup=datediffyear,convertdate,p.date\u of\u birth,getdate这样做永远不会在从字符串转换日期和/或时间时产生此错误转换失败。@pரதீப் 真正地如果出生日期是'20180231'?选择日期'18840218'没有问题;。我仍然非常在意数据中有一个虚构的日期。不,发生这种情况是因为您将日期存储为字符串-不-不-然后尝试将其转换为日期。格式无效。为什么出生日期不已经是日期?设置@agegroup=datediffyear,convertdate,p.date\u of\u birth,getdate这样做永远不会在从字符串转换日期和/或时间时产生此错误转换失败。@pரதீப் 真正地如果出生日期是'20180231'?选择日期'18840218'没有问题;。我仍然非常介意你的数据中有一个虚构的日期。嗨,戈登,有没有办法解决这个问题?我不能编辑这个表的结构,它是专有的。我能不能先在变量中将列转换为日期?@Theevininja他已经向您展示了一种解决问题的方法-将try\u convert添加到您的查询中。当然,您可以修复表中的数据,即使您无法修复数据类型,但您必须反复执行此操作,除非您首先采取措施防止更多坏数据进入表中。@GordonLinoff我忘了提到这是SQL Server 2008,而不是2012,所以请不要尝试转换,不幸地我更新了我帖子的标题。@Theevininja。您应该在问题中包含示例数据,以便我们知道日期应该是什么样子。@Theevininja在类似的古代版本中,您可以使用CONVERTdate,当IsDate p.date_of_birth=1,然后p.date_of_birth END,这基本上就是TRY_CONVERT所做的。但是你需要清理数据,用ISDATEdate_of_Borth=0和b的位置标识它,然后返回给供应商,告诉他们他们的设计是愚蠢的。嗨,戈登,有没有办法解决这个问题?我不能编辑这个表的结构,它是专有的。我能不能先在变量中将列转换为日期?@Theevininja他已经向您展示了一种解决问题的方法-将try\u convert添加到您的查询中。当然,您可以修复表中的数据,即使您无法修复数据类型,但您必须反复执行此操作,除非您首先采取措施防止更多坏数据进入表中。@GordonLinoff我忘了提到这是SQL Server 2008,而不是2012,所以请不要尝试转换,不幸地我更新了我帖子的标题。@Theevininja。您应该在问题中包含示例数据,以便我们知道日期应该是什么样子。@Theevininja在类似的古代版本中,您可以使用CONVERTdate,当IsDate p.date_of_birth=1,然后p.date_of_birth END,这基本上就是TRY_CONVERT所做的。但是你需要清理数据,用ISDATEdate_of_borning=0和b来标识它,然后返回给供应商,告诉他们他们的设计是愚蠢的。