【问题标题】:How to convert an internal numeric date to Access Date/Time format?如何将内部数字日期转换为访问日期/时间格式?
【发布时间】:2013-07-26 18:28:36
【问题描述】:

我从 PICK/UniVerse 数据库中获取了一些数据,其中包含 4 或 5 个字符数字格式的日期。以下是一些示例。我从数据库中获取了日期值,并将其与应用程序中显示的日期进行了比较:

9832       12/1/1994
10027      6/14/1995
10594      1/1/1997

是否可以将这些转换为可以作为日期/时间值放入 Access 的内容?

作为测试,我将 9832 以 General 格式输入 Excel,然后将其更改为 Short Date,它显示为 12/1/1926。所以它正好相差了 68 年。 10027 和 10594 也是如此。

【问题讨论】:

  • 你知道 41481 和 7/26/2013 有什么关系吗?从那以后有几天吗?几分钟后?没有这些信息可能很难,有了它应该很容易。
  • 我用从数据库中获取的实际日期值更新了我的问题,并与应用程序中显示的日期进行了比较。

标签: c# ms-access pick


【解决方案1】:

在 C# 中,您可以使用 DateTime.FromOADate

DateTime dt = DateTime.FromOADate(41481);

返回与指定 OLE 自动化日期等效的 DateTime。

这会给你:

dt = {26/07/2013 12:00:00 AM}

稍后您可以将该日期插入您的 Access 数据库中。

【讨论】:

  • 谢谢 .. 当我这样做时,月份和日期是正确的,但年份相差 68 年(例如:1926 年而不是 1994 年)。看起来我需要将 24837 添加到我的值中,然后使用 DateTime.FromOADate 来转换它们,这应该可以工作。
  • @JeffBrady,不客气,奇怪的是它已经关闭了 68 年,它的价值为 41481
  • 41481 实际上不在数据库中。我只是将其用作示例。我回去用实际数据更新了我的问题。
  • @JeffBrady,我想添加24837 应该是正确的方法,我不确定是否存在任何直接将该数字转换为日期的方法。
【解决方案2】:

访问日期/时间值实际上是双精度浮点数。整数部分代表一天,整数部分代表一天中的时间。

看起来那些选择日期数字直接对应于访问日期/时间值的日期部分。所以你可以使用CDate来改造它们。

? CDate(41481)
7/26/2013 

多做一些实验来感受一下:

? Date()
7/26/2013 
? CDbl(Date())
 41481 

请注意,尽管您的问题带有 c# 标记,但您不需要它来进行这些转换。您可以使用 Access 查询来执行这些操作,并要求数据库引擎应用这些功能。

由于事实证明这些日期数字始终偏移 68 年,因此您仍然可以在 Access 查询中进行转换。

? DateAdd("yyyy", 68, CDate(9832))
12/1/1994 
? DateAdd("yyyy", 68, CDate(10027))
6/14/1995 
? DateAdd("yyyy", 68, CDate(10594))
1/1/1997 

或者...

? CDate(9832 + CLng(24837))
12/1/1994 
? CDate(10027 + CLng(24837))
6/14/1995 
? CDate(10594 + CLng(24837))
1/1/1997 

【讨论】:

  • 谢谢 .. 我会在查询期间检查是否这样做。我正在做一个有 165 个字段的INSERT,所以它已经很乱了:)
【解决方案3】:

这个帖子有点晚了,但我会发布更多细节:Pick / MultiValue DBMS 将日期存储为一个整数,其中日期 0 = 1967 年 12 月 31 日。因此,当我在 2014 年 1 月 16 日写这篇文章时,内部选择日期是 16818。如果您使用以下代码,您将获得该幻数 24837:

DateTime.Parse("12/31/1967").Subtract( DateTime.FromOADate(0)).Days

因此,将其添加到您的 Pick Date 以获得 OADate。

如果您使用任何常见的 MV DBMS 库来提取数据(UniObjects、U2.NET、mv.NET ...),则不需要像这样转换日期。一个典型的函数可能如下所示:

string date = OConv( record["PurchaseDate"], "d2/" ); // "01/16/14"

或者,与其以内部 DBMS 格式提取数据,不如从外部格式开始。请让提供数据的 DBMS 开发人员为您执行此操作。他们很容易返回“date'd2/'”,而不仅仅是“date”。

如果您需要这方面的更多信息,请随时直接与我联系。

【讨论】:

    【解决方案4】:

    所有多值数据库日期(包括 UniVerse 和 UniData)均基于 1967 年 12 月 31 日的基准日期。您可以通过多种方式将此解析为外部数据。

    最喜欢的 - 例如如果使用 SQL 或内部数据库工具之一为与日期转换字段相关的字段创建数据字典条目,例如:

    'D2' 表示 2 位数年份 'D4' 表示 4 位数年份 'D4/' 表示带有斜线分隔符的 4 位数年份 'D4/E' 表示带有斜线分隔符的 4 位数年份,并且与美国格式 (MM/DD/YYYY) 相比,明确采用欧洲格式 (DD/MM/YYYY)。

    如果没有给出明确的格式,那么格式将默认为环境设置。还有其他格式选项,许多可以组合使用(如上)。

    如前所述,另一种方法是使用公式调整原始日期。日期为自 1967 年 12 月 31 日以来的天数 - 所有多值数据库的基础数据。

    【讨论】:

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