【问题标题】:Using a SELECT statement to return a row where a DateTime column = variable of type Date?使用 SELECT 语句返回 DateTime 列 = Date 类型变量的行?
【发布时间】:2011-09-18 19:59:31
【问题描述】:

我正在使用 OleDb,尝试这样做:

Dim d as Date = DateSerial(Year(rptDate), Month(rptDate), 1 - 1)

Dim conn as OleDbConnection = new OleDbConnection(connStr)
Dim cm as OleDbCommand = new OleDbCommand()

conn.Open()
cm.Connection = conn
cm.CommandText = "SELECT * FROM history WHERE ReportDate = " & d

好的,所以我知道它返回 1 行,因为我在 SQL Server 中盯着它。到目前为止,这是我对最后一行中的查询所做的尝试,但没有任何效果:

"SELECT * FROM history WHERE ReportDate = " & d
"SELECT * FROM history WHERE ReportDate = " & d.toString("G")
"SELECT * FROM history WHERE ReportDate = '" & d & "'"
"SELECT * FROM history WHERE ReportDate = '" & d.toString("G") & "'"
"SELECT * FROM history WHERE ReportDate = '#" & d & "#'"
"SELECT * FROM history WHERE ReportDate = #" & d & "#" 'These last 2 with toString

我也试过了:

cm.CommandText = "SELECT * FROM history WHERE ReportDate = ?"
cm.Parameters.Add(d)

cm.CommandText = "SELECT * FROM history WHERE ReportDate = ?"
cm.Parameters.Add(d.toString("G"))

cm.CommandText = "SELECT * FROM history WHERE ReportDate = '?'"
cm.Parameters.Add(d.toString("G"))

cm.CommandText = "SELECT * FROM history WHERE ReportDate = '?'"
cm.Parameters.Add(d)

显然我在这里遗漏了一些东西,帮助?我知道d 与SQL Server 中的日期相同,特别是3/31/2011 12:00:00 AM

【问题讨论】:

  • 数据库中 ReportDate 的数据类型是什么?
  • 在 SQL 中“玩”日期的最佳方式是将其格式化为yyyy-mm-dd,这样可以避免日/月冲突。所以你可以做 Dim ds As String = d.Year & "-" & d.Month & "-" & d.Day 然后在 sql 中:"SELECT * FROM history WHERE ReportDate >= '" & ds & "' AND ReportDate < DATEADD(DAY, 1, '" & ds & "')"
  • 假设您的 sql 版本是 2008 或更高版本,除非您也需要时间,否则最好使用 Date 数据类型。

标签: sql vb.net tsql ado.net oledb


【解决方案1】:

cm.CommandText = "SELECT * FROM history WHERE ReportDate = ?"
cm.Parameters.AddWithValue("ParamName", d)

根据您的提供者,您可能需要使用命名参数:

cm.CommandText = "SELECT * FROM history WHERE ReportDate = @date"
cm.Parameters.AddWithValue("date", d)

【讨论】:

  • SQLOLEDB 是连接字符串中的 Provider。第一个没有错误,就像 OP 中的错误一样,当我知道有一行时它不会返回任何内容。第二个返回关于必须声明标量变量@date 的错误。
  • 你的时间可能略有不同;第一个代码应该可以工作。试试><。您不使用 SqlClient 是否有原因?
  • 没有什么特别的原因,这个项目已经完成了一半,我继承了它,所以我一直在使用 OleDb。我不认为 > 或 d 的行。
  • 我知道,但他们会证明您的问题是日期不完全相等。 (可能在时间部分)你可能想写d.Date
  • 我想我找到了问题...所以数据库中有 2011 年的 4 个日期,一月、二月、三月、四月各一个。当我使用 DATEPART(year, ReportDate) = 2011 进行查询时,它带来三个结果,而不是四个。它跳过了三月,这是我现在需要的。什么?
【解决方案2】:

尝试在您的 SQL 中使用另一种日期格式,例如:

Cm.CommandText = "SELECT * FROM history WHERE ReportDate = '" & d.toString("mm/dd/yyyy") & "'"

【讨论】:

    【解决方案3】:

    您的意思是将您的日期变量 (d) 创建为 rptDate 值的前一天(即一天为零 (1-1))

    这个(下)将为您提供您的记录(假设记录没有时间部分)。

    SELECT * FROM history WHERE ReportDate = '" & d.toString("dd-MMM-yyyy") & "'"
    

    (明确的日期格式是明确的,而“G”不是。)

    ...或...

    cm.CommandText = "SELECT * FROM history WHERE ReportDate = @date"
    cm.Parameters.AddWithValue("@date", d)  
    

    【讨论】:

      【解决方案4】:

      如上所述,您的查询是询问“给我这个日期正好午夜的所有条目”。

      这样的事情应该会起作用:

      cm.CommandText = "DECLARE @MyDate DATETIME; SET @MyDate = ?; SELECT * FROM history WHERE ReportDate >= @MyDate AND ReportDate < DateAdd(day,1,@MyDate);"
      cm.Parameters.Add(d)
      

      这将返回当日午夜或之后以及第二天午夜之前的所有条目。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多