我需要在 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
字段。有什么想法吗?
最佳答案
来自评论:my db field is a timestamp
和I fix temp using a varchar instead a datetime or timestamp
一个TimeStamp
列与 DateTime
不太一样柱子。根据Documentation :
block 引用>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的问题是别的东西。将列定义为
DateTime
时或TimeStamp
,默认情况下会删除秒小数部分,以便与旧版本兼容。而不是定义任何类型的
Date
列为 string/text/varchar - 当然必须将其解析回来 - 您可以定义任一类型来保留小数秒。在 MySQL 5.6.4+ 中,您可以使用:DATETIME(n)
或TIMESTAMP(n)
(是的,这就是为什么括号显示在 UI 下拉列表中的原因)。哪里n
是要存储的小数位数 (0-6)。对于.NET,3
相当于毫秒。之后,WorkBench UI 也会显示毫秒:
- 开始日期是
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 '';这会自动设置
LastUpdated
添加到当前时间(UTC 等)的新项目的值以毫秒为单位(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定义为存储小数秒的列可以精确到微秒(刻度)。请注意,更新 SQL 不引用
LastUpdated
列,但它是由触发器更新的。如果您正在进行单步调试并使用上述变量,则触发时间可能会与其他时间不同,因为时间会随着您单步调试而流逝。
关于mysql - 如何保存和保留日期毫秒(MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34496672/