Sql server 将varchar值xxx转换为数据类型int时转换失败错误
我需要在特定日期之间获取数据。但是我得到了以下错误 AdsDateStarted:03/18/2010 01:51:38.000 AM AdsDateENded:09/13/2010 05:00:00.000下午 formatdate函数将今天的日期转换为2010年3月22日的格式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
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
- 请使用DateTime类型参数,不要将日期和时间组合为字符串
- 如果你必须这样做,请使用每个人都接受的国际表格。三:2010-03-22
如上所述,通过使用与语言无关的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中选择*可能是。我忽略了这个问题。可能是的。我忽略了这个问题。不,问题是日期根本没有被解析为日期,而是作为一个数字表达式。不,问题是日期根本没有被解析为日期,而是被解析为数字表达式。请记住我的答案。