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

标签 mysql .net vb.net

我需要在 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 timestampI fix temp using a varchar instead a datetime or timestamp

一个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的问题是别的东西。将列定义为 DateTime 时或TimeStamp ,默认情况下会删除秒小数部分,以便与旧版本兼容。

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

enter image description here

  • 开始日期是 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/

相关文章:

mysql - 维护专门的日志表或计算每个 sql 的条目数是更好的做法吗

Mysql创建有两个外键引用主键的表

php - EasyPhP 和 Mysql

c# - EQATEC 分析器与 DotTrace 相比如何?

c# - 如何在 .NET 中通过串行端口异步传输?

.net - GetBlobReferenceFromServer 不适用于相对 URI。错误: "Only absolute addresses are permitted"

asp.net - VB.Net IIf函数中添加SqlParameter

mysql - sql 计算两个值共享另一列中相同值的次数

c# - 访问文档属性 - VB 中的 Excel 工作簿/CSV

.net - .NET Entity Framework 中存在哪些设计模式?