用于将DateTime.Ticks值转换为SQL Date的MySQL脚本

时间:2016-01-09 15:20:16

标签: c# mysql sql datetime

我有一个旧的MySQL数据库,我将日期存储为C#DateTime.Ticks

现在我想将旧数据库转换为需要日期字段的PHP应用程序的新结构。如何将DateTime.Ticks转换为MySQL日期?

我正在寻找以下格式的YYYY-MM-DD HH:mm:ss

SELECT someconversion(olddate) as newDate FROM table;

非常感谢你提前

2 个答案:

答案 0 :(得分:3)

自0001-01-01 00:00:00 UTC世纪以来,Dotnet Ticks以100ns(每秒1000万)为单位存储在64位整数中。

MySQL Days (as used in FROM_DAYS())计算从0000-01-01开始的经过天数。

例如,Ticks中的2016-01-09 00:00:00635879124000000000,或者为了便于阅读

  635 879 124 000 000 000

因此,推测您的oldate列数据类型在MySQL中为BIGINTDOUBLE。要么是,要么是文本字符串。

要知道的是,UNIX Epoch 1970-01-01 00:00:00 UTC具有此Ticks值:621355968000000000。这是最终的神奇数字。

无论如何,这里是如何在MySQL中转换Ticks。我们将转换为UNIX时间戳,然后转换为DATETIME列。

SELECT FROM_UNIXTIME((yourcolumn/10000000.0) - (62135596800.0))

但是,这就是事情。此FROM_UNIXTIME()的输出会隐式转换为您当地的时间。您可能希望在存储此数据时保留UTC时间。

有两种方法可以做到这一点。一种是使用TIMESTAMP数据类型来存储这些转换时间。另一种是在执行此转换操作之前将MySQL会话时间戳设置为“UTC”,如下所示:

  SET time_zone = 'UTC';

这是另一种做同样事情的方法,但不依赖于使用Unix时间戳。 (这些时间戳仅在1970年至2038年有效。)它取决于将刻度转换为天数,然后将剩余部分转换为秒数。它将ticks直接转换为DATETIME数据类型。

select FROM_DAYS(365+(yourcolumn / 864000000000))
   + INTERVAL (yourcolumn % 864000000000) / 10000000 SECOND

常数864000000000(864 000 000 000)是一天中的刻度数。

打破这个局面:

  1. yourcolumn / 864000000000是自0001-01-01以来的天数
  2. FROM_DAYS(365+(yourcolumn / 864000000000))是约会。
  3. (yourcolumn % 864000000000) / 10000000是步骤1中除法的剩余部分,以秒为单位。
  4. FROM_DAYS(date) + INTERVAL seconds SECOND获取完整时间戳。

答案 1 :(得分:1)

这就是你想要的吗?

select DATE_FORMAT([yourcolumn],'%Y-%M-%D %H:%m:%s') from [yourtable];

以下是变体日期格式Date format options

的链接