MS-Access 将 SQL 服务器 datetime2 字段视为 TEXT

Posted

技术标签:

【中文标题】MS-Access 将 SQL 服务器 datetime2 字段视为 TEXT【英文标题】:MS-Access sees SQL server's datetime2 fields as TEXT 【发布时间】:2010-11-19 17:59:43 【问题描述】:

我正在将我的应用程序从 MS-Access FE 和 BE 升级到 MS-Access FE 和 SQL Server BE。我使用 SSMA Access“升迁”工具将所有表从 Access 转换为 SQL,然后使用 ODBC 链接 Access FE 中的 SQL 表。

在我的 access 数据库中,某些表具有 DateTime 列,这些列在 SQL Server 中的 datetime(0) 列中进行了转换。在 Access 中链接这些表后,Access 将这些列视为文本列,即使它们是 SQL Server BE 中的 datetime2(0) 列。

这会导致一些问题,因为使用日期格式的查询不适用于文本格式。是否有链接表格以便 Access 将 datetime(0) 字段视为日期时间值?

【问题讨论】:

你指的是 datetime2(0) 吗?日期时间应该与 MS Access 一起使用。我需要为 datetime2 做更多的事情。 @Remou:是的,我的意思是 datetime2(0),我会纠正这个问题。我必须承认我不知道 datetime 和 datetime2 之间的区别。使用 Access 需要做些什么? 我的意思是我需要了解更多信息。根据technet.microsoft.com/en-us/library/cc179181.aspx,对新数据类型datetime2 的支持有限。如果可以的话,我会选择数据时间。 @Remou:好的,我想我仍然可以重播导出,这次我将配置 SSMA 来创建日期时间字段。如果您将此作为答案,我会接受。 【参考方案1】:

类似问题:已解决

我有一个字段为 DATETIME2 数据类型的 SQL 服务器,并通过 ODBC 作为 Win7 上 MS Access 中的链接表连接到它。

当使用同一个数据库从两个不同的工作站连接时,一个具有“日期/时间”的正确数据类型,另一个具有“短文本”的数据类型

解决方案:事实证明,链接表是使用两个不同的 DSN 文件建立的,一个列出了“DRIVER=SQL Server”,另一个列出了“DRIVER=SQL Server Native Client 11.0”。 为了通过 ODBC 链接获得“日期/时间”数据类型,我需要使用 Client 11.0。

查看您安装了哪些驱动程序:

From the start menu search for "ODBC"
Select "Data Sources (ODBC)".  
Click on the "Drivers" tab 

您将看到已安装的驱动程序。我有三个。

SQL Server                     6.01.7601.17514
SQL Server Native Client 10.0  2007.100.5500.00
SQL Server Native Client 11.0  2011.110.6020.00

我相信 SQL Server 版本 6 由 Win7 安装并通过 Windows Update 进行更新。如果您只有这些,您将只能通过链接表从 DATETIME2 SQL 数据类型中获取 TEXT。

本机客户端分别由 SQL Server Management Studio 2008 和 2012 安装。

您可以从以下位置下载并安装 SQL Server Native Client 11.0 https://www.microsoft.com/en-us/download/details.aspx?id=36434

【讨论】:

感谢您为老问题提供新信息,欢迎来到 Stack Overflow! 可以修改 SSMA 以升级到较旧的日期时间。如果不打算使用并采用较新的本机 11 驱动程序,我建议这样做。较新的驱动程序是首选,但要求每个工作站都安装较新的驱动程序。出于这个原因,我目前使用默认安装在所有 Windows 机器上的旧版 SQL 驱动程序。【参考方案2】:

根据TechNet,对新数据类型 datetime2 的支持有限。如果可以的话,我会选择日期时间。

【讨论】:

【参考方案3】:

SSMA for Access 会将 SQL Server 中值无效的任何日期/时间字段转换为文本。您应该运行 SSMA 来尝试转换,它会告诉您问题,然后您可以在实际转换之前清理数据。

您必须跳过 SSMA 向导,因为它会在不预览结果的情况下进行升迁。

【讨论】:

【参考方案4】:

我遇到了同样的问题,这就是导致我访问此页面的原因,但我找到了解决方案: 问题:从访问 sql server 的链接表将 datetime2 列显示为文本,这具有许多含义,例如日期比较、排序等。

解决方法:将sql server中的datetime2转换为日期时间,访问会立即将该列显示为日期字段

请注意,由于表已经有数据,你不能只更改数据类型,我计划添加新列 datetime 类型,复制数据,删除 orig 列,重命名

如何检查准确性:我在 sql server、datetime、datetime2、date 中创建了一个包含 3 列的表,然后我从 access 链接到它,只有 datetime 在 access 中显示为日期字段,其他 2 个显示为文本

【讨论】:

【参考方案5】:

通常需要在升迁向导之前验证您的日期。用户倾向于输入 Access 日期字段接受但会导致 SQL Server 错误的“愚蠢”日期。尝试使用“BETWEEN 1/1/1930 和 1/1/2020”等合理范围之外的日期查询您的表,并在重新启动升迁向导之前更正这些日期。 我还发现了一个我没用过但看起来不错的产品:http://www.upsizing.co.uk/features_translate.aspx

【讨论】:

BETWEEEN 语句中的日期限制对于 SQL Server 不正确。参考文献说 1/1/1753 是起点。此外,SQL Server 2008 添加了一种新的日期字段,可以追溯到第一年。 @David:当然不是(这对 SQL Server 来说是可悲的)。我建议检查任何合理的日期范围(对于一个人的数据),以消除愚蠢的日期。

以上是关于MS-Access 将 SQL 服务器 datetime2 字段视为 TEXT的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别