【问题标题】:DateTime column not working in MS Access tables linked to MySQL backendDateTime 列在链接到 MySQL 后端的 MS Access 表中不起作用
【发布时间】:2017-01-03 23:54:06
【问题描述】:

我有一个带有 Microsoft Access (2016) 前端的 MySQL 数据库。我在 Access DB 中有许多包含 DateTime 列的链接表。

我已经在我的家用电脑和笔记本电脑上成功运行了这个数据库很长一段时间,但最近不得不更换我的笔记本电脑,所以刚刚安装在(很好地复制到)一个新笔记本电脑上。在这个新实例上,我的日期过滤器都不起作用。在调查中,我注意到非常奇怪的行为:如果我打开其中一个链接表,单击其中一个日期列中的任何值并选择仅过滤该值的选项,则不会显示任何内容。例如,如果我写一个查询来过滤

WHERE [Date]=#01/01/2017# 

没有返回任何内容。如果我将其重写为

WHERE CDate([Date])=#01/01/2017# 

它返回正确的记录(顺便说一下,我选择了这个日期来证明它不是英国/美国日期格式问题)。

该列在前端的链接表中正确显示为 DateTime 列,如果我编写查询来显示该列的年、月和日值,它会返回正确的值。

我正在运行完全更新的 Windows 10 Home,两台机器上都装有 Access 2016 MSO 16.0.7571.7063 和 MySQL Connector/ODBC 5.3.6。据我所知,我在 Access 中找不到两台机器之间不同的其他设置,而且我的区域设置和语言设置在两台机器上似乎也相同。

我尝试将 MySQL 列转换为 Date 而不是 DateTime,但没有任何区别。我也刷新了,然后在新笔记本上的版本上删除重新链接表格,甚至修复了Office安装,还是不爽。

顺便说一句,如果我将链接表复制到本地表,它工作正常。

我不知道是什么原因造成的。由于其他一切似乎都相同,我的新笔记本电脑上的某些注册表设置是否可能与我的其他 PC 不同?

编辑:我刚刚在笔记本上尝试了以下子句

WHERE [Date]>=#01/01/2017# And [Date]<=#31/12/2016#

它会返回所有记录!

进一步编辑:我也尝试过运行以下查询

Select count([date]) from daysworked where [date]>=#dd/mm/yyyy#

在某些 VBA 中,用于一系列日期。只要 dd 介于 1 和 20(含)之间,它就会返回 1753(所有行)。每当 dd 为 21 或更大时,无论 mm 和 yyyy 的值如何,它都会返回零。在我看来,这可能会将 dd 解释为世纪值。由于 MySQL 日期的格式为 yyyy-mm-dd,我想这可能有某种意义,但我希望 ODBC 连接器能够处理从 Access 到 MySQL 格式的转换。它显然在我运行过的所有其他机器上都很好。

【问题讨论】:

  • 顺便说一下,我使用的是 32 位 Unicode 版本的 MySQL ODBC 驱动程序
  • 我有一个类似的问题,但只有当我在 Windows Server 2016 终端服务上运行 accdb 文件时,日期过滤才会失败。如果我在本地运行相同的文件,它可以工作。在这两种情况下都使用相同的 ODBC 驱动程序,但我们不得不在服务器上使用 ODBC 版本 5.3。必须在服务器上安装 Visual C++ 可再发行组件才能使 ODBC 安装工作。我在对日期字段的引用周围添加了 CDate() 并修复了它。该应用程序在终端服务器上速度较慢,因此 ODBC 驱动程序可能对那个操作系统版本不满意。

标签: mysql odbc ms-access-2016 mysql-odbc-connector


【解决方案1】:

你有时间部分吗?这将返回什么:

WHERE [Date] Between #01/01/2017# And #01/02/2017# 

或者尝试在两台机器上显示数值并比较:

NumDate: CDbl([Date])

或者你真的有文字吗:

WHERE [Date] = '01/01/2017' 

【讨论】:

  • 我认为这可能与时间有关,这就是为什么我尝试将 MySQL 日期时间更改为普通日期的原因。但是您建议的 Between 选项也不会返回任何内容。奇怪的是,如果我尝试 >=#01/01/2017#,我会得到所有记录。他们回到 28/07/2017(英国格式)。 CDbl([Date]) 在我的笔记本上正确返回 01/01/2017 的 42736(直到今晚我才能在台式机上试用它)。不,这不是文字。如果我尝试在日期周围加上引号,我会得到数据类型不匹配。
  • 对不起,我的意思是他们回到 28/07/2008
  • 所以 >=#01/01/2017# 不是更晚而是更早日期返回?这真的很奇怪,实际上不可能,所以一定是发生了其他事情。例如,>=#01/01/2010# 返回什么范围?
  • >=#01/01/2010# 返回与 >=#01/01/2017# 相同的范围。我对原始问题添加了一些编辑,提供了一些更“有趣”的信息。
【解决方案2】:

我在笔记本上创建了新的数据库,并使用相同的 ODBC DSN 在其中添加了链接表,它工作正常。所以它必须与我正在使用的特定 accdb 文件有关。我找不到任何可以做到这一点的数据库设置,所以我开始怀疑是否存在损坏。

至少这给了我一个修复,虽然是一个痛苦的修复,构建一个新的 Access accdb 并将我的所有对象移动到其中。但我很想知道为什么这只发生在我的笔记本上,而不是运行相同 accdb 文件和相同 ODBC 连接器的任何其他 PC 上。

【讨论】:

  • 这可以解释事情。从新数据库中,您可以一次性导入旧数据库中的所有对象。但保留链接表并在新数据库中重新创建这些链接。
【解决方案3】:

我现在已经建立了一个新的数据库,所有后端表都添加为新的链接表,它已经解决了这个问题。

我已经检查了尽可能多的设置,并且找不到两个数据库之间的任何差异,因此我只能得出结论,旧的前端数据库已损坏。认为我最好将其发布为答案,以防万一其他人遇到同样的问题!

【讨论】:

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