2010-03-22 111 views
0

我需要在特定日期之间取数据。但我得到以下错误。将varchar值xxx转换为数据类型int时转换失败

AdsDateStarted:2010年3月18日01:51:38.000 AM AdsDateENded:2010年9月13日05:00:00.000 PM

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) 

回答

0
  • 使用DateTime类型的参数,请不要放在一起的日期和时间作为字符串。
  • ,如果你要做到这一点,使用被接受everywhree国际形式:2010-03-22

你的问题是客户端和服务器之间的最有可能的不同的语言环境。您格式为3/22,服务器理解“第22个月的第3天”。

如上所述,这是通过使用语言中立iso格式的参数绕过的。

+0

不,问题是日期根本不会被解析为日期,而是作为数字表达式。我的答案是。 – Guffa 2010-03-22 14:26:20

1

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

但是,我强烈建议您参数化查询,而不是像这样动态构建它。因此,例如...

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

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

2

原因是你忘记了日期周围的撇号,所以你会得到像3/22/2010这样的表达式,而不是像'3/22/2010'这样的日期文字。表达式求值为一个int值,因此数据库会尝试将varchar值转换为int值以便比较它们。

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

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

+0

可能是的。我忽视了这个问题。 – TomTom 2010-03-22 12:50:24

+0

@TomTom:不仅仅可能。 – Guffa 2010-03-22 14:31:11

0

SQL Server将'yyyyMMdd hh:mm:ss'识别为有效的日期时间并允许您以此格式进行比较。所以如果你的formatDateTime函数返回yyyyMMdd格式的日期。您无需在AdsDateStarted上进行转换& AdsDateEnded。

例子:
SELECT * FROM Ads WHERE AdsDateStarted > '20100101' AND AdsDateEnded <= '20100321 11:59:59'

该查询将检索所有匹配日期条件的记录。

相关问题