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

Posted

技术标签:

【中文标题】MySQL 脚本将 DateTime.Ticks 值转换为 SQL Date【英文标题】:MySQL script to convert DateTime.Ticks values to SQL Date 【发布时间】:2016-04-14 05:02:48 【问题描述】:

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

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

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

SELECT someconversion(olddate) as newDate FROM table;

非常感谢您

【问题讨论】:

【参考方案1】:

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

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

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

  635 879 124 000 000 000

因此,在 MySQL 中,您的 oldate 列数据类型大概是 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 年期间有效。)这取决于将刻度转换为天数,然后将余数转换为秒数。它将刻度直接转换为 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 获取完整的时间戳。

【讨论】:

【参考方案2】:

这是你想要的吗?

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

这里是变体日期格式的链接Date format options

【讨论】:

以上是关于MySQL 脚本将 DateTime.Ticks 值转换为 SQL Date的主要内容,如果未能解决你的问题,请参考以下文章

在 DataGridView 中显示之前将时间戳(Datetime.ticks)从数据库转换为 Datetime 值

如何在 C++ ATL/MFC 中检索具有相同格式的刻度,如 DateTime.Ticks

C# DateTime 与时间戳相互转换

.net 计算当前时间距离今晚00:00:00还有多少分多少秒

在 Oracle 中生成 .Net 报价

C# 计算两个日期的时间间隔