Access 数据库的 .NET 查询将 dd/mm/yyyy 日期文字误解为 mm/dd/yyyy

Posted

技术标签:

【中文标题】Access 数据库的 .NET 查询将 dd/mm/yyyy 日期文字误解为 mm/dd/yyyy【英文标题】:.NET query of Access database misinterprets dd/mm/yyyy date literal as 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 数值的值本身。 【参考方案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") + "#"

【讨论】:

可能不是戈德所说的最正确的方法,但它对我有用。谢谢

以上是关于Access 数据库的 .NET 查询将 dd/mm/yyyy 日期文字误解为 mm/dd/yyyy的主要内容,如果未能解决你的问题,请参考以下文章

从 VB.NET 查询 Access 数据库中的 Yes/No 字段

如何将 MS-Access 选择查询的结果保存在 C#.net 中的变量中?

VB.Net 使用创建表查询将 MS Access 表中的 AllowZeroLength 属性设置为否

如何通过 ASP.net 网站将新条目插入 Access db 表?

ASP.NET把数据查询出来保存在了一个datatable里面了,之后我想把这个datatable的数据导入到access数据库

在 ADO.NET 中使用 ODBC 调用预定义的 Access 查询