【问题标题】:How to insert an unambiguous datetime如何插入明确的日期时间
【发布时间】:2014-09-26 12:20:52
【问题描述】:

我需要将一个 csv 文件导入我的访问权限,其中包含格式为 dd/mm/yyyy hh:mm:ss 的日期时间列

这是我目前正在做的事情

DoCmd.TransferText acImportDelim, "my_specification", "temp_table", filePath, True

updateQuery = "Update my_table " _
            & "INNER JOIN " _
            & "(SELECT field1, field2, field_date " _
            & "FROM temp_table) " _
            & "ON my_table.field1 = temp_table.field1 AND my_table.field2 = temp_table.field2  " _
            & "SET my_table.field_date = temp_table.field_date " _
            & "WHERE my_table.field_date IS NULL"

我使用 TransferText 将 csv 文件内容临时存储到表中。 “my_specification”用于指定日期时间列格式为dd/mm/yyyy hh:mm:ss。

然后我使用更新查询来更新临时表中的日期时间字段。

但是,这里的问题是 temp_table.field_date 格式会根据用户的系统区域设置而有所不同。如果我的用户将 mm/dd/yyyy 作为系统设置,则会在 my_table 中创建错误的更新。

为了更好地描述问题,以日期 2014 年 8 月 4 日为例。在 CSV 文件中,存储为 04/08/2014 12:12:12。然后将其导入到我的 temp_table field_date 列中。

当我更新 my_table 时,用户的区域设置因素会出现。如果我的用户将系统日期格式设置为 dd/mm/yyyy,则可以正确读取为 2014 年 8 月 4 日。但是,如果我的用户将系统日期设置为 mm/dd/yyyy,则日期将读取为 2014 年 4 月08.

我是否可以为此更新强制使用明确的日期时间格式?

我用的是MS Access 2013,但我希望数据库也能兼容Access 2003。

谢谢。

【问题讨论】:

  • 您能确认一下吗:根据您的 cmets,我假设 temp_table.field_date 是一个 TEXT 列。它始终包含您指定格式的日期,即dd/mm/yyyy hh:mm:ss。 my_table.field_date 是一个 DATE 列。在具有美国日期设置的计算机上更新语句失败。我的所有假设都是对的吗?如果没有,请更新您的问题以包含列数据类型的详细信息
  • 问题类似于stackoverflow.com/questions/16661737/…,这个解决方案应该可以工作。
  • @DaleM:不,一点也不相似。该解决方案适用于 SQL Server。如何在 Access 中使用转换功能?
  • Access 等效项是CDate(value)
  • @cha csv文件中的原始字段可以是TEXT,但是在我的TransferText函数与规范之后,它已经在temp_table.field_date中转换为日期时间格式

标签: sql ms-access vba ms-access-2003 ms-access-2013


【解决方案1】:

尚不清楚您从用户那里获得的 CSV 文件是否已经包含正确格式的日期。

无论如何,解决此问题的唯一方法是首先从用户那里获得正确的信息。
要么:

  • 您让用户以明确的格式导出日期,例如 ISO 8601 日期格式 yyyy/mm/dd hh:mm:ss

  • 或者您从每个用户那里知道他们的区域设置日期格式是什么,并创建多个规范以将 CSV 文件导入您的temp_table(您需要为每个数据导入选择正确的规范)。

如果你不能做到这两个,这意味着你只是得到一个 CSV 文件并且你不知道它来自哪里,那么你就不能轻易地解决你的问题。

“猜测” CSV 文件格式的一种方法是在 CSV 文件中设置一个虚拟字段,其日期为 2014 年 12 月 24 日,例如在第一条记录中。
使用一些代码,您可以检查该虚拟记录的日期格式,并确定它是否存储在24/12/201412/24/2014,甚至2014/12/24。取决于您可以在导入 CSV 文件时切换规范。
当然,这只有在您能够控制用户生成 CSV 文件的方式时才有可能。

如果 CSV 文件包含一个月中某一天的大量数据,那么您可以通过扫描每个日期的写入方式来检测它们的日期格式并检查,例如,该日期是否对某个日期有效给定格式。
仅当您确定 CSV 文件中始终有足够的数据来涵盖至少一条第 13 天或以上的记录时,这才有效。

基本上,这一切都取决于您对 CSV 文件的控制权,或者至少您可以对其数据做出哪些假设。

【讨论】:

  • 我无法控制 csv 文件或用户的区域设置。但 csv 日期格式固定为 dd/mm/yyyy hh:mm:ss。正如我之前所描述的,将日期导入我的 temp_table 没有问题。但是当我使用 temp_table 中的日期时间值更新 my_table 时,问题就出现了
  • 有些事情没有意义。如果您的用户确实根据正确的日期格式创建 CSV 文件,那么他们的语言环境并不重要,然后将数据导入 my_table 应该可以工作。您是唯一一个导入数据的人,还是您的用户也在他们自己的计算机上的 Access 应用程序中导入数据?
  • 我从来没有提到过我的用户创建 csv 文件... CSV 文件是从具有固定格式 dd/mm/yyyy 的不同系统传输的
猜你喜欢
  • 1970-01-01
  • 2021-03-22
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
相关资源
最近更新 更多