【问题标题】:Store datetime -time only in Access database仅在 Access 数据库中存储 datetime -time
【发布时间】:2021-12-04 21:12:26
【问题描述】:

我有一个 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"))

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

我怎样才能只存储时间?

【问题讨论】:

  • Access中这个字段的数据类型是什么?
  • 你来了。日期/时间正在将您的字符串转换为日期/时间。由于您没有提供日期,它会为您提供日期。

标签: vb.net datetime


【解决方案1】:

如果您查看 MS-Access 中可用的数据类型,您会发现不仅有用于时间值的类型,而且还有用于日期/时间值的类型。这意味着 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

【讨论】:

  • 稍微测试一下就发现了一件有趣的事情。尝试传递(对于日期部分)值 1899,12,30 我无法解释,但也没有任何特定格式,访问网格不显示日期部分
【解决方案2】:

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

?Format(#00:00:00#,"yyyy/mm/dd hh:nn:ss")回车
1899/12/30 00:00:00

?Format(#08:31:57#,"yyyy/mm/dd hh:nn:ss")回车
1899/12/30 08:31:57

结果显示 Access 用于其时间轴的原点。

另一个实验表明:

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

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

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


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

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

?CDbl(#1899/12/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)。

【讨论】:

  • 有趣! :D 我会调查的! :)
【解决方案3】:

您将数据类型与格式混淆了。在您的数据库中,您插入的列具有datetime 数据类型(Access 没有数据类型只是时间)。这意味着它将其中的所有内容存储为日期 + 时间。

如果在 Access 中您看到的值只有一个时间,则 Access 可能认为该日期没有用(可能是因为它的存储日期为 1900 年 1 月 1 日)。

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

【讨论】:

  • 我知道,这很奇怪。正如我所说,数据库已经带有值。在“EventTime”中,这是一个日期/时间,其中包含以下数据:“9:00 AM”。就是这样。也许访问忽略了一个日期,但我看不到任何被忽略的日期!问题是,当我从数据库中读取数据时,原始值只有时间,而我保存的数据有日期和时间。反正。史蒂夫现在已经解决了! :D
猜你喜欢
  • 2012-04-21
  • 1970-01-01
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多