使用VB.net/MS Access查询两个日期之间的记录

时间:2015-05-11 05:57:43

标签: sql vb.net ms-access

我正在使用名为stockitems的ms访问表, 表结构是......

stdate     stitems
01-04-2015   Red
02-04-2015   Blue
08-04-2015   Green
01-05-2015   Grey
02-05-2015   Violet
09-05-2015   Purple
04-06-2015   Sky Blue

我使用以下代码从该表中选择记录......

Dim report As New CrystalDecisions.CrystalReports.Engine.ReportDocument
    Dim xs, xs2, cmp As String
    xs = date1.Text
    xs2 = date2.Text
    cmp = salsqkrpt.salcom.Text
    Dim cmd1 As OleDbCommand = New OleDbCommand("SELECT * from stockitems  where stdate    between '" & date1.Text & "'and '" & date2.Text & "'",con)
    myDA = New OleDbDataAdapter(cmd1)
    myDataSet = New DataSet()
    myDA.Fill(myDataSet, "stockitems ")
    report.Load(Application.StartupPath & "\stockreport.rpt")
    report.SetDataSource(myDataSet.Tables("stockitems "))
    stckreport.CrystalReportViewer1.ReportSource = report

此处date1 and date2 was masked textbox,掩码为00-00-0000 (DD-MM-YYYY)  在排除此代码时,报告仅从前两个字符串中获取仅dd,当我分配date1=01-04-2015date2=03-05-2015时,结果就像......

      stdate     stitems
    01-04-2015   Red
    02-04-2015   Blue
    01-05-2015   Grey
    02-05-2015   Violet

  but my expected result is 

    stdate     stitems
    01-04-2015   Red
    02-04-2015   Blue
    08-04-2015   Green
    01-05-2015   Grey
    02-05-2015   Violet

它没有作为日期工作,请帮助我解决这个问题开发人员,我是vb.net的初学者。提前谢谢。

4 个答案:

答案 0 :(得分:4)

MS / Access将日期解释为mm / dd / yy,因此您从1月4日开始选择数据 - > 3月5日。在SQL中将日期重新格式化为mm-dd-yyyy。一般来说,Ms / Access实际上需要格式为#mm / dd / yyyy#的日期文字(即使用#')。

Dim dtDate1 as DateTime = DateTime.Parse(date1.text)
Dim dtDate2 as DateTime = DateTime.Parse(date2.text)

Dim cmd1 As OleDbCommand = New OleDbCommand("SELECT * from stockitems where stdate Between #" & _
                                            dtDate1.ToString("MM/dd/yyyy") & "# And #" & _
                                            dtDate2.ToString("MM/dd/yyyy") & "#",con)

您的代码让您对SQL注入开放。首先验证日期,然后将它们作为参数传递或使用DataTime变量格式化SQL(上图)。

答案 1 :(得分:2)

您需要在SQL中使用格式正确的日期表达式:

concat $ transpose [[1,2,3],[4,5,6]]

答案 2 :(得分:0)

日期的MS Access内部存储格式为美国默认值:MM / DD / YYYY 如果你的windows语言环境日期格式是DD / MM / YYYY,就像在欧洲一样,你应该在查询你的日期之前做一个format()。

因此,您的查询应为:

Dim cmd1 As OleDbCommand = New OleDbCommand("SELECT * from stockitems  where stdate    between #" & format(date1.Text,"MM/DD/YYYY") & "# and #" & format(date2.Text,"MM/DD/YYYY") & "#",con)

或与 - 分隔符一样:

Dim cmd1 As OleDbCommand = New OleDbCommand("SELECT * from stockitems  where stdate    between #" & format(date1.Text,"MM-DD-YYYY") & "# and #" & format(date2.Text,"MM-DD-YYYY") & "#",con)

答案 3 :(得分:0)

在MS-ACCESS或SQL中,日期字段的数据类型应为日期/时间。那些格式应为“DD / MM / YYYY”然后我们不需要更改标准代码......