如何保存和保留Date毫秒(MySQL)

时间:2015-12-28 15:58:03

标签: mysql .net vb.net

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

Date.Now

但这会返回一个简单的日期为2015年12月28日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字段。有什么想法吗?

3 个答案:

答案 0 :(得分:4)

来自评论:my db field is a timestampI fix temp using a varchar instead a datetime or timestamp

TimeStamp列与DateTime列完全相同。根据{{​​3}}:

  
    

MySQL将TIMESTAMP值从当前时区转换为UTC进行存储,然后从UTC转换回当前时区进行检索。 (对于其他类型,例如DATETIME,不会出现这种情况。)

  

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

小数秒

Documentation的问题是另一回事。将列定义为DateTimeTimeStamp时,默认情况下会删除小数秒,以便与旧版本兼容。

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

Fractional Seconds

  • StartDate为DateTime(0)(无分数)
  • LastUpdated为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)可能更好,但问题只是烦恼有关ms)。请务必在默认值中指定相同的位数。

然后,在更新每条记录时,不要手动传递DateTime.Now(或转换为字符串),而是添加一个触发器来为您更新列。在MySql Workbench中:

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语句。

测试代码

这显示了从代码到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

结果:

  

代码var:615中的DT ms   来自DB 0的DT.MS   来自DB 615413的Micro   MS来自触发器615

定义为存储小数秒的列这样做的时间是微秒(滴答)。请注意,Update SQL不引用LastUpdated列,但它会在触发器的帮助下更新。如果您正在进行步骤调试并使用上述变量,则触发时间可能与其他时间不同,因为您在单步执行时会过去。

答案 1 :(得分:0)

试试这个

Public Shared Function MillisecondsDate()

    Return Date.Now.ToString("dd/MM/yyyy HH:mm:ss.fff")
End Function

答案 2 :(得分:-1)

尝试此功能:




 公共共享功能MillisecondsDate()
返回DateTime.UtcNow.ToString(“dd / MM / yyyy HH:mm:ss.fff”)
结束函数