2013-07-26 45 views
1

我从PICK/UniVerse数据库中获取一些数据,其中包含4或5个字符数字格式的日期。下面是一些例子..我抓住从数据库中日期值,并与它的日期被显示在应用程序中:如何将内部数字日期转换为访问日期/时间格式?

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

是否有可能将这些转换成一些可以投入Access作为日期/时间值?

作为一项测试,我把Excel中的9832作为General格式,然后将其更改为Short Date,它出现在12/1/1926。所以这已经过去了68年。对于10027和10594也是如此。

+0

你知道41481怎么样与7/26/2013相关?这是几天以来?自从分钟?如果没有这些信息,它可能很难,它应该很容易。 –

+0

我使用从数据库中获取的实际日期值更新了我的问题,并与应用程序中显示的日期进行了比较。 –

回答

3

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

DateTime dt = DateTime.FromOADate(41481); 

返回datetime等同于指定的OLE自动化日期。

这会给你:

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

以后你可以插入你的Access数据库日期。

+0

谢谢..当我这样做的时候,月份和日子都是正确的,但是这一年已经过去了68年(例如1926年而不是1994年)。它看起来像我需要将24837添加到我的值,然后使用DateTime.FromOADate来转换它们,这应该工作。 –

+0

@ JeffBrady,不客气,奇怪它已经过去了68年,它的价值'41481' – Habib

+0

41481实际上并没有在数据库中..我只是用它作为例子。我回去并用实际数据更新了我的问题。 –

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 
+0

谢谢..我会在查询过程中检查这一点。我正在做一个有165个字段的'INSERT',所以它已经非常凌乱了:) –

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 /'”而不仅仅是“date”是很容易的。

如果您需要更多信息,请直接与我联系。

相关问题