gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 01:53:43 27 4
gpt4 key购买 nike

我需要在 vb.net 中生成也有毫秒的当前日期。其实我用:

Date.Now

但是这会返回一个简单的日期 28/12/2015 16:53,我还想要毫秒,例如:

28/12/2015 16:53:48640864

我试过:

Public Shared Function MillisecondsDate()

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

End Function

但这会返回一个错误的结果:

16:53:56.9884043

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

最佳答案

来自评论:我的数据库字段是一个时间戳并且我使用 varchar 而不是 datetime 或时间戳来修复 temp

TimeStamp 列与 DateTime 列不太一样。根据Documentation :

MySQL converts TIMESTAMP values from the current time zone to UTC for storage, and back from UTC to the current time zone for retrieval. (This does not occur for other types such as DATETIME.)

这是您可能永远看不到的东西,即使 MySQL WorkBench UI 也能将它转换回来。

小数秒

Fractional Seconds的问题是别的东西。将列定义为 DateTimeTimeStamp 时,默认情况下会删除小数秒,以与旧版本兼容。

与其将任何类型的 Date 列定义为字符串/文本/varchar - 当然还必须将其解析回来 - 您可以定义任何一种类型以保留小数秒。在 MySQL 5.6.4+ 中,您可以使用:DATETIME(n)TIMESTAMP(n)(是的,这就是为什么括号显示在UI 下拉列表)。其中 n 是要存储的小数位数 (0-6)。对于 .NET,3 等同于毫秒。之后,WorkBench UI 也会显示毫秒数:

enter image description here

  • StartDate 是 DateTime(0)(无小数)
  • 上次更新时间为 TimeStamp(3)
  • Foo 是 TimeStamp(6)

触发器

LastUpdated 列似乎最好由数据库管理,因此您不必通过代码来管理——或者忘记这样做!。使用默认值和 Before_Update 触发器非常简单:

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

ADD COLUMN LastUpdated TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '';

这将自动设置添加到当前时间(UTC 等)的新项目的 LastUpdated 值,以毫秒为单位(TIMESTAMP(6) 可能更好,但问题只担心女士)。请务必在默认值中指定相同数量的数字。

然后,不是在更新每条记录时手动传递 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 WorkBench 中,查看表定义时单击“触发器”选项卡 - 只需添加 SET 语句。

测试代码

这显示了从代码到数据库再返回的毫秒数小数部分,并显示触发器有效(使用上面显示的表格):

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 in code var: 615
DT.MS from DB 0
Micro from DB 615413
MS from trigger 615

定义为存储小数秒的列可以精确到微秒(滴答)。请注意,Update SQL 不引用 LastUpdated 列,但它是由触发器更新的。如果您正在逐步调试并使用上述变量,则触发时间可能与其他变量不同,因为时间在您逐步调试时流逝。

关于mysql - 如何保存和保留日期毫秒数(MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34496672/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com