Private Sub chaxun_Click() '查询数据并冲入msflexgrid
    Dim sq As String
    Dim ti As Data
    connecttoserver
    
    sq = "select * from tb_cl  where DATEADD(d, -14,fbytxrq)  between'" & MaskEdBox1.Text & "' and '" & MaskEdBox2.Text & "'order by flzrq asc"********这个地方**********     提示错误:向列smalldatetime添加值时导致溢出,
     时间超出的也会提示这个比如往后2100年,再有就是dateadd第二个参数如果写成负数,明明有相应的数据,却得不到结果      Call executesql(sq)  '首先判断sql语句执行是否出错
    If Err.Number <> 0 Then
         MsgBox "错误代码:" & Err.Number & vbCrLf & _
          "错误描述" & Err.Description, vbCritical + vbOKOnly, "连接错误"
        disconnect
        biaoge.Clear
        biaoge.Rows = 1
        Label3.Caption = 0
        Form_Load
        Exit Sub
    End If
    querydata (sq)
    If rs.RecordCount = 0 Then  '如果结果为空,或者sql语句出错
        Set rs = Nothing
        disconnect
        biaoge.Clear
        biaoge.Rows = 1
        Label3.Caption = 0
        Form_Load
        Exit Sub
    End If

解决方案 »

  1.   

    Public Function executesql(ByVal strsql As String) As Boolean '用于执行sql语句,查看结果是否为空
        On Error Resume Next
            G_dbcon.Execute (strsql)             '执行sql语句
            If Err.Number <> 0 Then
                'Err.Clear
                executesql = False
            Else
                executesql = True
            End If
    End Function
      

  2.   

    可以啊,MaskEdBox1.Text 和MaskEdBox2.Text 
    属于用户输入格式为2009-01-01 select * from tb_cl  where DATEADD(d, -14,fbytxrq)  between'2009-05-01' and '2009-06-01 'order by flzrq asc如果后数14天没事,前数就不行,超过了也不行
      

  3.   

    SmallDateTime: 值范围从 1900 年 1 月 1 日到 2079 年 6 月 6 日。
    如果你的字段 fbytxrq 的值就是 1900-01-01,再用 DATEADD 减 14 天当然会产生越界错误。
    你可以在条件中将 between 两个边界值各加 14 天达到一样的目的。
      

  4.   

     sq = "select * from tb_cl  where DATEADD(d, -14,fbytxrq)  between'" & MaskEdBox1.Text & "' and '" & MaskEdBox2.Text & "'order by flzrq asc"你的SQL语句写法肯定是有问题的,WHERE条件的左边用函数[DATEADD(d, -14,fbytxrq)],就用不到索引的,这样查询就是整表扫描.建议先修改为:
     sq = "select * from tb_cl  where fbytxrq between'" & DATEADD(d, -14,cast(MaskEdBox1.Text as datetime))& "' and '" & DATEADD(d, -14,cast(MaskEdBox2.Text as datetime))& "'order by flzrq asc"
      

  5.   

    select * from tb_cl  where CONVERT(VARCHAR(8),DATEADD(DAY,-2,GETDATE()),112) between'" & MaskEdBox1.Text & "' and '" & MaskEdBox2.Text & "'order by flzrq asc"语句有问题,用这句,112是参数,可更改为别的形式,参见帮助
      

  6.   

    干吗要SQL里用dateadd,直接在VB代码里用不就好了
      

  7.   

    是吗、?怎么用?
    我要查出在一个时间范围内的数据,不用sql?如何拿?
      

  8.   

    9楼的意思是你可以先定义两个变量(strBeginDate,strEndDate),把MaskEdBox1.Text 和MaskEdBox2.Text 的值先加上14赋给strBeginDate和strEndDate,然后修改sq行为: 
    sq = "select * from tb_cl  where fbytxrq between'" & strBeginDate & "' and '" & strEndDate & "'order by flzrq asc" 
      

  9.   

      提示错误:向列smalldatetime添加值时导致溢出, 有列的数据类型是smalldatetime,你添加的可能是DATETIME,你可以试一下把所有smalldatetime的列改成datatime试试看看
      

  10.   

    sq = "select * from tb_cl  where DATEADD(d, -14,fbytxrq)  between'" & MaskEdBox1.Text & "' and '" & MaskEdBox2.Text & "'order by flzrq asc"********这个地方**********---sql语句写法有问题!where后不能dateadd(d,-14,fbytxrq)
      

  11.   

    语句好像没什么问题,具体出错是在Call executesql(sq) 这句吗?
    如果是这样你直接把sq的语句放到查询分析器里运行一下看
      

  12.   

    5楼11楼方法应可行的!~`SQL语句改一下应该也可以的

    DATEADD(d, -14,fbytxrq)改成
    DATEADD(d, -14, convert(datetime,sdatae,20))就不用加减了
      

  13.   

    意思是 DATEADD(d, -14,fbytxrq) 不需要,直接用 fbytxrq,这样 between 条件中加 14 天是等价的。