注册 登录
编程论坛 ASP技术论坛

从字符串转换为 datetime 时发生语法错误。

月夜NO风 发布于 2008-07-17 11:56, 3617 次点击
做的一个订单查询系统,从日期查询订单,用的是ASP+SQL.
从"日期-日期"查询,就是从时间段查询.
在表单里有两个"INPUT",一个是PurBD,一个是PurBd2.
所用语句是:
StrSQL=StrSQL+"and dBillDay between '%"+Request.Form("PurBd")+"%' and '%"+Request.Form("PurBd2")+"%'"
SQL数据库中类型为DATATIME,长度为8.
查询时出错:
错误类型:
Microsoft OLE DB Provider for SQL Server (0x80040E07)
从字符串转换为 datetime 时发生语法错误。
/pur_list.asp, 第 56 行

POST Data:
PurBn=&PurBd=2007-01&PurBd2=2007-01&PurBrd=&PurUp=%B2%E9%D1%AF

用SQL查询分析器查询时,
格式是
2007-01-01 00:00:00.000     
上网查的都和我的不同.为什么呢?
25 回复
#2
dhdhzzw2008-07-17 13:23
查询时先格式化
format
#3
hmhz2008-07-17 13:30
模糊查询好象不需要格式化吧,要不就不是模糊查询了
#4
madpbpl2008-07-17 13:51
Response.write StrSQL
#5
月夜NO风2008-07-17 15:11
查了一下,FORMAT DATATIME是吗?
FormatDateTime 函数
返回表达式,此表达式已被格式化为日期或时间。

FormatDateTime(Date[, NamedFormat])

参数
Date

必选项。要被格式化的日期表达式。

NamedFormat

可选项。指示所使用的日期/时间格式的数值,如果省略,则使用 vbGeneralDate。

设置
NamedFormat 参数可以有以下值:

常数 值 描述
vbGeneralDate 0 显示日期和/或时间。如果有日期部分,则将该部分显示为短日期格式。如果有时间部分,则将该部分显示为长时间格式。如果都存在,则显示所有部分。  
vbLongDate 1 使用计算机区域设置中指定的长日期格式显示日期。
vbShortDate 2 使用计算机区域设置中指定的短日期格式显示日期。
vbLongTime 3 使用计算机区域设置中指定的时间格式显示时间。
vbShortTime 4 使用 24 小时格式 (hh:mm) 显示时间。


说明
下面例子利用 FormatDateTime 函数把表达式格式化为长日期型并且把它赋给 MyDateTime:

 Function GetCurrentDate
  'FormatDateTime 把日期型格式化为长日期型。
  GetCurrentDate = FormatDateTime(Date, 1)
End Function

但是我还是不太明白.....
#6
dhdhzzw2008-07-17 15:31
顺便说一下,asp里'%"+Request.Form("PurBd")+"%'和'%"&Request.Form("PurBd")&"%'的区别在哪里?
#7
月夜NO风2008-07-17 16:33
[bo][un]dhdhzzw[/un] 在 2008-7-17 15:31 的发言:[/bo]

顺便说一下,asp里'%"+Request.Form("PurBd")+"%'和'%"&Request.Form("PurBd")&"%'的区别在哪里?

我当然不知道啦........
我只知道他们都是变量......
相信这个你也知道啦~
哈哈
#8
multiple19022008-07-17 17:40
[bo][un]dhdhzzw[/un] 在 2008-7-17 15:31 的发言:[/bo]

顺便说一下,asp里'%"+Request.Form("PurBd")+"%'和'%"&Request.Form("PurBd")&"%'的区别在哪里?

一,你给的这段代码不完整(语法上说),提问时尽量用完整的、有意义的代码。

二,在这里没有任何区别。

三,asp里,分为JScript和VBScript讨论,JScript里必须用加号。

四,

连接运算符 (&)
强制两个表达式进行字符串连接。

result = expression1 & expression2
参数
result
任意变量。
expression1
任意表达式。
expression2
任意表达式。
说明
任一 expression 不是字符串时,它将被转换为 String 子类型。如果两个表达式都为 Null,result 也为 Null。然而,如果仅有一个 expression 为 Null,则它和其他表达式连接时,按零长度字符串("") 处理。任何表达式为 Empty 时也按零长度字符串处理。


加法运算符(+)
计算两个数之和。

result = expression1 + expression2
参数
result
任意数值变量。
expression1
任意表达式。
expression2
任意表达式。
说明
[bo]虽然也可以使用 + 运算符连接两个字符串,但是您仍应使用 & 运算符进行字符串的连接以避免混淆,提供易理解的代码。
这是因为在使用 + 运算符时,有可能无法确定是做加法还是做字符串连接。[/bo]

表达式的基本子类型决定了 + 运算符所做的操作,如下表所示:

如果  则
两个表达式都是数值 相加
两个表达式都是字符串 连接
一个表达式是数值,另一个表达式是字符串 相加

如果一个表达式或两个表达式都为 Null 表达式,则 result 为 Null。如果两个表达式都为Empty,则 result 为 Integer 子类型。但是如果一个表达式为 Empty,则返回另一个表达式作为 result。
#9
月夜NO风2008-07-19 08:28
试了一天多,还是出现错,我已经用了FORMAT........
代码如下 :
<%
Function genSQLstr()
    Dim sId,PurBd,PurBd2
    sId=session("sId")
    PurBd= FormatDateTime(Date, 1)
    PurBd2= FormatDateTime(Date, 1)
    if Request.Form("PurBn")<>"" then
    StrSQL=StrSQL+"where sBillNo like '%"+Request.Form("PurBn")+"%'"
    else
    StrSQL=StrSQL+"where sSuppId='"& sId &"'"
    end if
    if Request.Form("PurBd")<>"" and Request.Form("PurBd2")<>"" then
    StrSQL=StrSQL+"and dBillDay between '%"+Request.Form("PurBd")+"%' and '%"+Request.Form("PurBd2")+"%'"
    end if
   
    if Request.Form("PurBrd")<>"" then
    StrSQL=StrSQL+"and dRecDate = '%"+Request.Form("PurBd")+"%'"
    end if

    ' 只获取到自己的订单
    strSQL=strSQL & " and sSuppId='" & Replace(sId,"'","''") & "'" ' 防止注入攻击
#10
月夜NO风2008-07-19 08:32
假如上面的:
PurBd= FormatDateTime(Date, 1)
PurBd2= FormatDateTime(Date, 1)
改为:
Request.Form("PurBn")= FormatDateTime(Date, 1)
Request.Form("PurBd2")= FormatDateTime(Date, 1)
就会提示:
错误类型:
Microsoft VBScript 运行时错误 (0x800A01B6)
对象不支持此属性或方法: 'Request.Form'
#11
月夜NO风2008-07-19 08:40
而如果定义为变量再引用,也不行:如下代码:!!
<%
Function genSQLstr()
    Dim sId,PurBdd,PurBdd2
    sId=session("sId")
    PurBdd=Request.Form("PurBd")
    PurBdd= FormatDateTime(Date, 1)
    PurBdd2=Request.Form("PurBd2")
    PurBdd2= FormatDateTime(Date, 1)
    if Request.Form("PurBn")<>"" then
    StrSQL=StrSQL+"where sBillNo like '%"+Request.Form("PurBn")+"%'"
    else
    StrSQL=StrSQL+"where sSuppId='"& sId &"'"
    end if
    if Request.Form("PurBd")<>"" and Request.Form("PurBd2")<>"" then
    StrSQL=StrSQL+"and dBillDay between 'Purdd' and 'Purdd2'"
    end if
   
    if Request.Form("PurBrd")<>"" then
    StrSQL=StrSQL+"and dRecDate = '%"+Request.Form("PurBrd")+"%'"
    end if

    ' 只获取到自己的订单
    strSQL=strSQL & " and sSuppId='" & Replace(sId,"'","''") & "'" ' 防止注入攻击
End function
%>
错误类型:
Microsoft OLE DB Provider for SQL Server (0x80040E07)
从字符串转换为 datetime 时发生语法错误。
/pur_list.asp, 第 60 行
#12
月夜NO风2008-07-22 08:11
时至今日,BETWEEN还是用不出来。。。。。。。
#13
dhdhzzw2008-07-22 09:11
第60行在哪里?作出标记啊!
Format(时间字段,"yyyy-M-d")把时间字段转化成时间格式,才能按这个格式搜索。。。。
#14
月夜NO风2008-07-22 10:09
假如我的时间字段是dBillDay,那么就要Format(dBillDay,"yyyy-M-d")么?
那么假如是我要取表单中的数据来代入SQL语句,
那么应该是先DIM了日期,然后再FORMAT,最后在ASP中的SQL语句中调用吗?
#15
月夜NO风2008-07-22 10:18
但是我在上面试了几个都不行啊。。。。。
#16
yms1232008-07-22 10:19
日期时间好像不支持模糊查询的
#17
月夜NO风2008-07-22 11:08
[bo][un]yms123[/un] 在 2008-7-22 10:19 的发言:[/bo]

日期时间好像不支持模糊查询的

现在我想要日期到日期查询,就是查询具体日期到具体日期!
应该是用BETWEEN吧?但是我做程序的时候说
从字符串转换为 datetime 时发生语法错误。
而SQL数据库中的字段类型是DATATIME,长度是8,应该是长日期吧?

[[it] 本帖最后由 月夜NO风 于 2008-7-22 11:10 编辑 [/it]]
#18
月夜NO风2008-07-22 12:01
真希望有人能帮帮我解决这个问题。。。。。。。。自己试了好多次FORMAT DATETIME都不行,不是出这错就是出那错。。。。。
#19
multiple19022008-07-22 13:37
sql里面日期很麻烦的……反正我一直避免用日期格式,能用也用最简单的语法。
#20
月夜NO风2008-07-22 14:07
但是万恶的主管一定要我用日期段来查询。。。。。。。
他认为SQL那么简单的东西,有什么麻烦的。。。。。。。。。。。
开始我也这样以为,但是我发现自己错了。。。。
#21
月夜NO风2008-07-22 16:31
如果用下拉菜单来选择是否可以解决问题?
#22
multiple19022008-07-22 16:38
那就看书 也不会有多难。
我就是懒得看书而已
#23
yms1232008-07-22 20:28
StrSQL=StrSQL+"and dBillDay between '#"+Request.Form("PurBd")+"#' and '#"+Request.Form("PurBd2")+"#'"
#24
月夜NO风2008-07-23 11:00
[bo][un]yms123[/un] 在 2008-7-22 20:28 的发言:[/bo]

StrSQL=StrSQL+"and dBillDay between '#"+Request.Form("PurBd")+"#' and '#"+Request.Form("PurBd2")+"#'"

没出错,但是没有用,就是不能查询到日期段中的数据。
版主大人再帮我想想吧。
是不是还是转换类型不成功所以没有数据筛选出来啊?
#25
月夜NO风2008-07-23 15:45
用convert可以吗?
SELECT   convert(char,你的日期字段,120)   as   date2   FROM   table
#26
madpbpl2008-07-25 02:56
还是那句,把你的sql输出看看对不对
Response.Write sql
1