如何保存和保留日期毫秒 (MySQL)

标签: Vb.net MySQL .Net
发布时间: 2017/4/8 11:31:44
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我需要在有也有毫秒的 vb.net 中生成当前日期。实际上我使用︰

Date.Now

但这返回一个简单的日期作为 2015/12/28 16:53,我也要像毫秒︰

2015/12/28 16:53:48640864

我试图与︰

Public Shared Function MillisecondsDate()

    Return Date.Now.ToString("HH:mm:ss.fffffff")

End Function

但这将返回一个坏的结果︰

16:53:56.9884043

我需要一种格式兼容 MySql 的准确 lastUpdated 字段。有什么想法?

解决方法 1:

从评论︰ my db field is a timestampI fix temp using a varchar instead a datetime or timestamp

A TimeStamp 的列不是完全不同的 DateTime 列。 根据文档

从当前时区与 UTC 的存储,和回从 UTC 为检索当前的时区,MySQL 转换时间戳值。(这并不发生为其他类型,如 DATETIME。)

它是你可能永远不会看到的东西,甚至MySQL 工作台UI 将其转换回来。

秒的小数部分

秒的小数部分的问题是别的东西。 当定义列作为 DateTimeTimeStamp ,秒的小数部分被删除,默认情况下,为了与旧版本兼容。

而不是定义任何排序的 Date 列作为字符串/文本/varchar-,当然不必解析它回来-你可以定义两种类型保留秒的小数部分。 在 MySQL 5.6.4+,您可以使用︰ DATETIME(n)TIMESTAMP(n) (是的这就是为什么括号 UI 下拉列表中的显示)。 其中 n 是数字的小数位数来存储 (0-6)。 为使.NET, 3 将等同于毫秒。 在那之后,工作台 UI 显示的毫秒数,以及︰

enter image description here

  • 开始日期是 DateTime(0) (没有 fractionals)
  • 上次更新是TimeStamp(3)
  • Foo 是TimeStamp(6)

触发器

A LastUpdated 列似乎最佳托管由数据库,所以你不必这样做通过代码 — — 或忘记这样做 ! 这是非常简单的使用默认值和 Before_Update 触发器︰

  • 定义的列TIMESTAMP(3)
  • 指定 CURRENT_TIMESTAMP(3) 作为默认值

添加列 LastUpdated TIMESTAMP(3) 不为 NULL 默认 CURRENT_TIMESTAMP(3) 评论 ';

这会自动设置 LastUpdated 上新项目添加到当前时间 (UTC 等) 以毫秒为单位的值 ( TIMESTAMP(6) 可能会更好,但问题只担心 ms)。 一定要在默认指定的相同的数字个数。

然后,而不是通过 DateTime.Now 手动 (或将转换为字符串) 时更新每个记录,添加触发器为你更新的列。 在 MySql 工作台︰

CREATE DEFINER=`root`@`localhost` TRIGGER `test`.`demo_BEFORE_INSERT` BEFORE INSERT ON `demo` FOR EACH ROW  
BEGIN  
    SET new.LastUpdated := now(3);  
END 

其中绝大部分是 UI 工具创建的样板。 你只需要键入︰

    SET new.LastUpdated := now(3);  

对于此类型的列,您将可以添加同一件事上 BEFORE_INSERT 触发器替代默认值。在MySQL 工作台,单击"触发器"选项卡,查看表定义时 — — 只需添加 SET 的语句。

测试代码

这显示毫秒的小数部分制作代码至 db 的来回往返,表明该触发器 (使用以上所示的表) 的作品︰

Dim Usql = "UPDATE Demo SET Foo = @p1 WHERE Id=5"
Dim Ssql = "SELECT Name, StartDate, Foo, LastUpdated FROM Demo WHERE Id=5"

Dim dtVar As DateTime = DateTime.Now
Console.WriteLine("DT ms in code var: {0}", dtVar.Millisecond)

Using dbcon = GetMySQLConnection()
    dbcon.Open()
    Using cmd As New MySqlCommand(Usql, dbcon)
        cmd.Parameters.AddWithValue("@p1", dtVar)
        cmd.ExecuteNonQuery()
    End Using

    Using cmd As New MySqlCommand(Ssql, dbcon)
        Using rdr As MySqlDataReader = cmd.ExecuteReader
            If rdr.HasRows Then
                rdr.Read()

                Dim tempDT = rdr.GetMySqlDateTime(1)    ' DateTime(0)
                Console.WriteLine("DT.MS from DB {0}", tempDT.Millisecond)

                Dim mydt = rdr.GetMySqlDateTime(2)    ' TimeStamp(6)
                Console.WriteLine("Micro from DB {0} ", mydt.Microsecond)

                ' either get method retains the ms      TimeStamp(3)
                Dim lstupD = Convert.ToDateTime(rdr("lastUpdated"))
                Console.WriteLine("MS from trigger {0}", lstupD.Millisecond)
            End If
        End Using
    End Using
End Using

结果︰

DT ms 在代码 var: 615
DB 0 的 DT.MS
DB 615413 的微
触发器 615 的女士

定义用于存储秒的小数部分的列到微秒 (蜱虫) 这样做了。请注意,更新 SQL 不引用 LastUpdated 列,但它由触发器更新。 如果你是单步执行调试,使用上面的触发时间作为变量可以从其他不同,因为时间的流逝你单步执行。

赞助商