1

我从 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 也是如此。

4

4 回答 4

3

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

DateTime dt = DateTime.FromOADate(41481);

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

这会给你:

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

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

于 2013-07-26T18:38:11.243 回答
1

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

看起来那些选择日期数字直接对应于访问日期/时间值的日期部分。所以你可以用它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 
于 2013-07-26T18:31:46.817 回答
1

这个线程有点晚了,但我会发布更多细节:Pick / MultiValue DBMS 将日期存储为一个整数,日期 0 = 12/31/1967。因此,当我在 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”。

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

于 2014-01-16T08:38:14.800 回答
0

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

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

'D2' 表示 2 位数年份 'D4' 表示 4 位数年份 'D4/' 表示 4 位数年份,带斜线分隔符(DD/MM/YYYY) 与美国格式 (MM/DD/YYYY) 相比。

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

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

于 2020-06-02T11:41:46.693 回答