如何将内部数字日期转换为访问日期/时间格式?

时间:2013-07-26 18:28:37

标签: c# ms-access pick

我从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 个答案:

答案 0 :(得分:3)

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

DateTime dt = DateTime.FromOADate(41481);
  

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

那会给你:

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

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

答案 1 :(得分:1)

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

看起来那些选择日期编号直接对应于访问日期/时间值的日期部分。因此,您可以使用CDate转换它们。

? CDate(41481)
7/26/2013 

进行更多实验以了解这一点:

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

请注意,尽管您的问题已使用c#标记,但您无需执行这些转换。您可以使用Access查询执行它们,并要求db引擎应用这些函数。

由于事实证明这些日期编号一直偏移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 

答案 2 :(得分:1)

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

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

然后将其添加到您的选择日期以获取OADate。

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

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

或者不是以内部DBMS格式提取数据,而是应该以外部格式启动它。请提供数据的DBMS开发人员为您执行此操作。他们真的很容易返回“date'd2 /”而不仅仅是“约会”。

如果您需要此领域的更多信息,请随时直接与我联系。

答案 3 :(得分:0)

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

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

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

如果未给出明确的格式设置,则该格式将默认为环境设置。还有其他格式设置选项,很多可以组合使用(与上述格式一样)。

如先前所建议的,替代方法是使用公式调整原始日期。日期是自1967年12月31日以来的天数-所有多值数据库的基础数据。