如何在2个DateTimes之间选择记录

时间:2013-12-31 04:25:57

标签: vb.net oledb ole

我试过了

SQLCommand = "SELECT * 
              FROM myTable 
              WHERE recDateTime 
                    BETWEEN '30/12/2013 23:49:09' AND '31/12/2013 00:01:29'"

但它返回“条件表达式中的数据类型不匹配”。 OleDb异常。我在这里做错了吗?因为我似乎无法看到问题。

recDateTime是DateTime字段。这两个日期是DateTimes

我在VB.NET中使用OLEDB。

3 个答案:

答案 0 :(得分:0)

SQLCommand = "SELECT * 
              FROM myTable 
              WHERE  format(recDateTime,'dd/MM/yyyy') 
                     BETWEEN '30/12/2013' AND '31/12/2013'"

试用此代码

SELECT * 
FROM   wwwh 
WHERE  Format(entry_date, 'MM/dd/yyyy hh:NN:ss tt') BETWEEN 
       '12/10/2013 09:00:00 AM' AND '12/11/2013 10:00:00 AM' 

答案 1 :(得分:0)

数据库很可能试图以en-US格式解释文字日期字符串。您可以通过在查询中使用参数来完全消除该问题,如下所示:

Dim oledbSql = "SELECT * FROM myTable WHERE recDateTime BETWEEN ? AND ?"
Dim oledbSqlCmd As New OleDbCommand(oledbSql, oledbConn)
Dim dtStart As New DateTime(2013, 12, 30, 23, 49, 9)
Dim dtEnd As New DateTime(2013, 12, 31, 0, 1, 29)

oledbSqlCmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@Start", .OleDbType = OleDbType.Date, .Value = dtStart})
oledbSqlCmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@End", .OleDbType = OleDbType.Date, .Value = dtEnd})
' now execute the query

您实际上不必为参数命名,但它可以更容易地查看正在发生的事情(这有助于维护)。但是,您必须按照它们的使用顺序添加它们,因为?用作每个参数的占位符。

如果您使用SQL Server作为数据库,那么使用System.Data.SqlClient而不是System.Data.OleDb会更好(因为它已针对它进行了优化),然后您可以在查询中使用命名参数:

Dim sql = "SELECT * FROM myTable WHERE recDateTime BETWEEN @Start AND @End"
Dim sqlCmd As New SqlCommand(sql, sqlConn)
Dim dtStart As New DateTime(2013, 12, 30, 23, 49, 9)
Dim dtEnd As New DateTime(2013, 12, 31, 0, 1, 29)

sqlCmd.Parameters.Add(New SqlParameter With {.ParameterName = "@Start", .SqlDbType = SqlDbType.DateTime, .Value = dtStart})
sqlCmd.Parameters.Add(New SqlParameter With {.ParameterName = "@End", .SqlDbType = SqlDbType.DateTime, .Value = dtEnd})
' now execute the query

请不要试图使用.AddWithValue,因为它会对foul things up意外的数据类型做出假设。

此外,您应该(几乎)总是从数据库中显式地声明所需的列,而不是使用*,因为数据库可以按照它想要的任何顺序自由返回列 - 这可能不是命令你认为他们会被归还。

根据您使用的实际数据库,参数名称可能需要使用:而不是@作为前缀。

[我认为我不妨回答这个问题,而不是仅对其他提议的答案持消极态度。]

答案 2 :(得分:-3)

 Dim da As OleDbDataAdapter = New OleDbDataAdapter(
            "SELECT * 
            FROM TableID
            WHERE (Format(ColumnID, 'hh:NN:ss tt') 
                  BETWEEN '00:00:00 AM' AND '01:00:00 AM') And [ColumnID] = True ",
  "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source =Database1.mdb")
相关问题