我有一个旧的MySQL数据库,我将日期存储为C#DateTime.Ticks。
现在我想将旧数据库转换为需要日期字段的PHP应用程序的新结构。如何将DateTime.Ticks转换为MySQL日期?
我正在寻找以下格式的YYYY-MM-DD HH:mm:ss
:
SELECT someconversion(olddate) as newDate FROM table;
非常感谢你提前
答案 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:00
为635879124000000000
,或者为了便于阅读
635 879 124 000 000 000
因此,推测您的oldate
列数据类型在MySQL中为BIGINT
或DOUBLE
。要么是,要么是文本字符串。
要知道的是,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)是一天中的刻度数。
打破这个局面:
yourcolumn / 864000000000
是自0001-01-01以来的天数FROM_DAYS(365+(yourcolumn / 864000000000))
是约会。(yourcolumn % 864000000000) / 10000000
是步骤1中除法的剩余部分,以秒为单位。FROM_DAYS(date) + INTERVAL seconds SECOND
获取完整时间戳。答案 1 :(得分:1)
这就是你想要的吗?
select DATE_FORMAT([yourcolumn],'%Y-%M-%D %H:%m:%s') from [yourtable];
以下是变体日期格式Date format options
的链接