仅在Access数据库中存储datetime -time

时间:2015-12-21 21:03:50

标签: vb.net datetime

我有一个vb.net程序,更新访问数据库中的时间值。数据库使用OleDB连接。

基本上这就是发生的事情:

Dim commandBuilder As New OleDb.OleDbCommandBuilder(dataEventAdapter)

eventDataset.Tables("EventList").Rows(selectedEvent)("EventTime") = Format(dateTimePick.Value, "hh:mm tt")

dataEventAdapter.Update(eventDataset, "EventList")

时间来自日期时间选择器,它应该只存储时间值。

问题是,数据库中已经有值,它只有时间,如:上午9:00,但是当我用这个更新时,它也会得到日期。说实话,我不知道从哪里获取日期。如果我

MsgBox(Format(dateTimePick.Value, "hh:mm tt"))

我只得到时间,没有别的。

如何只存储时间?

3 个答案:

答案 0 :(得分:2)

如果你看一下MS-Access中可用的数据类型,你会发现只有Time类型的类型,但是有一个Date / Time值的类型。这意味着Access将始终存储您提供的值的日期和时间。您观察到的MS-Access网格显示的显示由表格结构页面中的格式设置控制,您可以在此处更改它以显示数据的时间部分。

说,有一个问题是你没有提供DateTime值,而是一个字符串。访问是优雅的(?)足以不触发此异常,但补偿自己添加日期,因此您应该看到您提供的每个值的当前日期。

因此,您不应该关注如何显示您的值,而是更多地关注如何将该值传递给数据库。如果只有时间部分对您的程序有意义,那么让数据库引擎将您的字符串转换回日期时间值不是一个选项。 (没有谈论这种自动化将涉及的本地化问题)

我建议为Date部分传递一个常量值(如DateTime.MinValue或1/1/1)并将时间加到此值。通过这种方式,如果您最终需要对此数据使用某些查询,则可以轻松忽略日期部分。

Dim dt As DateTime = new DateTime(1,1,1, dateTimePick.Value.Hour, _
                                         dateTimePick.Value.Minute,
                                         dateTimePick.Value.Second)
eventDataset.Tables("EventList").Rows(selectedEvent)("EventTime") = dt

答案 1 :(得分:1)

您可以在Access中进行简单的实验。使用 Ctrl-G 打开立即窗口并输入

  

?格式(#00:00:00#,“yyyy / mm / dd hh:nn:ss”)输入
  1899/12/30 00:00:00

     

?格式(#08:31:57#,“yyyy / mm / dd hh:nn:ss”)输入
  1899/12/30 08:31:57

结果显示了其时间轴的原始访问用途。

另一项实验表明:

  

?#1899/12/30 08:31:57#输入
  08:31:57

Access仅自动显示日期1899/12/30的时间部分。

因此,我建议使用此日期作为仅限时间数据的基础。

Access使用Double值在内部存储日期,其中整数部分表示自1899/12/30以来经过的天数,小数部分表示24小时的分数(即0.25为06:00) am和0.75是18:00)。

  

?CDbl(#1899 / 12/30 08:00:00#)输入
  0.333333333333333

     

?CDbl(#1899年至1812年/ 30#)输入
  0

     

?CDATE(0)输入
  00:00:00

     

?CDATE(0.25)输入
  06:00:00

在.NET中,您可以使用System.DateTime.FromOADate(d As Double) As Date方法将给定为Double的访问日期转换为.NET日期(VB Date = System.DateTime)。

答案 2 :(得分:0)

您将数据类型与格式混淆。在您的数据库中,您插入的列具有UPDATE mainscores a JOIN ( select Column2, sum(Column7) total from (select Column2, Column7 from mtsr1a union all select Column2, Column7 from engr1a ) t group by Column2 ) xx ON a.Column2 = xx.Column2 SET a.overall_scores = xx.total; 数据类型(Access暂时没有数据类型)。这意味着它将所有内容存储为日期+时间。

如果在Access中您只看到一个时间的值,则可能是Access确定日期无用(可能是因为它存储的日期为1/1/1900)。

要记住的是,日期仍然存储。当您重新显示数据时,只需将其格式化为仅显示时间。从您的代码示例来看,您已经知道如何做到这一点。