Sql server 将varchar值xxx转换为数据类型int时转换失败错误

Sql server 将varchar值xxx转换为数据类型int时转换失败错误,sql-server,Sql Server,我需要在特定日期之间获取数据。但是我得到了以下错误 AdsDateStarted:03/18/2010 01:51:38.000 AM AdsDateENded:09/13/2010 05:00:00.000下午 formatdate函数将今天的日期转换为2010年3月22日的格式 SQL = "SELECT * FROM Ads" SQL = SQL & " WHERE AdsActive = 1 AND AdsAreasID = "& rtt &" AND CONVE

我需要在特定日期之间获取数据。但是我得到了以下错误

AdsDateStarted:03/18/2010 01:51:38.000 AM AdsDateENded:09/13/2010 05:00:00.000下午

formatdate函数将今天的日期转换为2010年3月22日的格式

SQL = "SELECT * FROM Ads"
SQL = SQL & " WHERE AdsActive = 1 AND AdsAreasID = "& rtt &" AND CONVERT(VARCHAR(10), AdsDateStarted, 101) <= "& formatdate(Date()) &" AND CONVERT(VARCHAR(10), AdsDateEnded, 101) >= "& formatdate(Date()) &""
Set kdFonksiyon = objConn.Execute(SQL)
SQL=“从广告中选择*
SQL=SQL&“其中AdsActive=1和AdsAreasID=“&rtt&”和CONVERT(VARCHAR(10),AdsDateStarted,101)=“&formatdate(Date())&”
设置kdFonksiyon=objConn.Execute(SQL)
  • 请使用DateTime类型参数,不要将日期和时间组合为字符串
  • 如果你必须这样做,请使用每个人都接受的国际表格。三:2010-03-22
您的问题很可能是客户端和服务器之间的不同区域设置。您的格式为3/22,服务器理解“22个月的第3天”

如上所述,通过使用语言无关的iso形式的参数,可以绕过此问题。

  • 请使用DateTime类型参数,不要将日期和时间组合为字符串
  • 如果你必须这样做,请使用每个人都接受的国际表格。三:2010-03-22
您的问题很可能是客户端和服务器之间的不同区域设置。您的格式为3/22,服务器理解“22个月的第3天”


如上所述,通过使用与语言无关的iso形式的参数可以绕过此问题。

一个直接的问题是,需要在要连接到SQL字符串中的日期值周围加上单引号。另外,通过使用标准ISO格式(如:yyyy-mm-dd),尽量避免任何日期时间转换问题

不过,我强烈建议您对查询进行参数化,而不是像这样动态地构建查询。比如说

SQL = "SELECT * FROM Ads WHERE AdsActive=1 AND AdsAreasID = @rtt AND....."

然后将值作为参数传递给查询。这将有助于提高性能(执行计划重用)和安全性(有助于防止SQL注入)。

当前的问题之一是,需要在要连接到SQL字符串中的日期值周围加上单引号。另外,通过使用标准ISO格式(如:yyyy-mm-dd),尽量避免任何日期时间转换问题

不过,我强烈建议您对查询进行参数化,而不是像这样动态地构建查询。比如说

SQL = "SELECT * FROM Ads WHERE AdsActive=1 AND AdsAreasID = @rtt AND....."

然后将值作为参数传递给查询。这将有助于提高性能(执行计划重用)和安全性(有助于防止SQL注入)。

原因是您忘记了日期周围的撇号,因此您得到了一个表达式,如
3/22/2010
,而不是日期文字,如
'3/22/2010'
。表达式的计算结果为int值,因此数据库也会尝试将varchar值转换为int值,以便进行比较

您应该使用参数,而不是将日期作为字符串插入查询中。这样,您就不必费心使用撇号,但更重要的是,您不必猜测数据库可能接受的日期格式


当您使用日期作为字符串时,现在编写代码时,将字符串解析为日期没有问题,但是由于您选择了一种与字符串不可比的日期格式,比较将无法正常工作。如果要将日期作为字符串进行比较,则必须使用ISO 8601格式(如2010-03-22)作为字符串进行比较,或者最好将日期作为正确的日期进行比较,这会更快。(如果可以使用索引,速度会快得多。)

原因是您忘记了日期周围的撇号,因此您得到了一个表达式,如
3/22/2010
,而不是日期文字,如
'3/22/2010'
。表达式的计算结果为int值,因此数据库也会尝试将varchar值转换为int值,以便进行比较

您应该使用参数,而不是将日期作为字符串插入查询中。这样,您就不必费心使用撇号,但更重要的是,您不必猜测数据库可能接受的日期格式


当您使用日期作为字符串时,现在编写代码时,将字符串解析为日期没有问题,但是由于您选择了一种与字符串不可比的日期格式,比较将无法正常工作。如果要将日期作为字符串进行比较,则必须使用ISO 8601格式(如2010-03-22)作为字符串进行比较,或者最好将日期作为正确的日期进行比较,这会更快。(如果可以使用索引,速度会更快。)

SQL Server将“yyyyMMdd hh:mm:ss”识别为有效的日期时间,并允许您使用此格式进行比较。所以,如果formatDateTime函数以yyyyMMdd格式返回日期,就可以了。您不需要在adsDateStart和AdsDateEnded上进行转换

示例:


从Ads中选择*,其中AdsDateStarted>'20100101'和ADSDATENDEDSQL Server将'yyyyMMdd hh:mm:ss'识别为有效的日期时间,并允许您使用此格式进行比较。所以,如果formatDateTime函数以yyyyMMdd格式返回日期,就可以了。您不需要在adsDateStart和AdsDateEnded上进行转换

示例:


从AdsDateStarted>'20100101'和ADSDATESended的Ads中选择*可能是。我忽略了这个问题。可能是的。我忽略了这个问题。不,问题是日期根本没有被解析为日期,而是作为一个数字表达式。不,问题是日期根本没有被解析为日期,而是被解析为数字表达式。请记住我的答案。