【问题标题】:.NET query of Access database misinterprets dd/mm/yyyy date literal as mm/dd/yyyyAccess 数据库的 .NET 查询将 dd/mm/yyyy 日期文字误解为 mm/dd/yyyy
【发布时间】:2015-10-13 19:59:30
【问题描述】:

请帮助我了解发生了什么

我有一个 Visual Basic 应用程序,它从访问数据库返回数据 我想用这种格式“01/12/2015”(12 月 1 日)查询带有日期的 db 字段 为此,我有一个 datetimepicker

我的数据库中有这条记录 - 01/12/2015

当我更新我的代码以将它的 datetimepicker 值包含到查询中时,它不会返回任何内容,如果我输入 2015 年 12 月 1 日,它会找到 2015 年 1 月 12 日的记录

我的查询如下所示:

dim dd as date 
dd = datetimepicker.value
qrytxt = "select * from table where [Date] = #" + dd + "#"

如果我放一个 msgbox 来返回 qrytxt 它会返回

select * from table where [Date] = #01/12/2015#

但它仍然会根据数据库检查错误的日期...

我也有这个 Imports System.Globalization,我读过一些关于 CultureInfo 的内容,但我无法在我的查询中使用它。

还有什么我需要包括或做的吗?

【问题讨论】:

  • “我有一个 Visual Basic 应用程序...” - 你的意思是 VB.NET 应用程序吗?
  • Access db 引擎会将where [Date] = #01/12/2015# 解释为 1 月 12 日。也许您打算 01/12/2015 表示 12 月 1 日。但这令人困惑,因为您的问题说 2015 年 1 月 12 日代表 1 月 1 日,这是不合理的。
  • 我相信在您的 VBA 中,因为您将 dd 声明为日期,它已默认为您的语言环境首选日期格式 dd/mm/yyyy,但我猜是 Access,至少是这样您正在连接它,并不关心您的语言环境,而是只想接收mm/dd/yyyy 格式。这是典型的数据库具有它喜欢的默认日期格式并且您必须遵守它。无论好坏。
  • 对查询中的文字日期值使用 yyyy-m-d 格式。例如,如果您想定位 2015 年 1 月 12 日 ...WHERE [Date] = #2015-1-12#
  • 格式仅供展示。它不会影响基于 Double 数值的值本身。

标签: sql vb.net datetime ms-access globalization


【解决方案1】:

为什么会这样?

发生这种情况是因为日期文字不明确,并且与 Access 数据库引擎假定不明确的日期文字的格式不匹配。

在动态 SQL 中使用日期文字无论如何都是错误的方法。 DateTimePicker 返回一个真正的System.DateTime 值(始终是明确的),因此您应该将其用作参数化查询的一部分:

Using cmd As New OdbcCommand("SELECT COUNT(*) AS n FROM Clients WHERE DOB = ?", conn)
    cmd.Parameters.Add("?", OdbcType.DateTime).Value = DateTimePicker1.Value.Date
    MessageBox.Show(cmd.ExecuteScalar)
End Using

【讨论】:

    【解决方案2】:

    只需对您的日期值强制使用格式来为日期创建字符串表达式:

    Dim dd As Date 
    dd = datetimepicker.value
    qrytxt = "select * from table where [Date] = #" + dd.ToString("yyyy'/'MM'/'dd") + "#"
    

    【讨论】:

    • 可能不是戈德所说的最正确的方法,但它对我有用。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 2018-03-31
    • 2014-05-30
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多