Arc*_*rus 3 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;
Run Code Online (Sandbox Code Playgroud)
提前非常感谢
自 0001-01-01 00:00:00 UTC 纪元以来,Dotnet 刻度以 100ns(每秒一千万)为单位存储在 64 位整数中。
MySQL Days(如 中使用的FROM_DAYS())计算从 0000-01-01 开始经过的天数。
例如,为了便于阅读,2016-01-09 00:00:00在 Ticks 中是or635879124000000000
635 879 124 000 000 000
Run Code Online (Sandbox Code Playgroud)
因此, MySQL 中的oldate列数据类型可能是BIGINTor DOUBLE。要么是这样,要么它是一个文本字符串。
需要知道的是 UNIX Epoch1970-01-01 00:00:00 UTC具有以下 Ticks 值:621355968000000000。这是最终的神奇数字。
无论如何,以下是如何在 MySQL 中转换 Ticks。我们将转换为 UNIX 时间戳,然后转换为DATETIME列。
SELECT FROM_UNIXTIME((yourcolumn/10000000.0) - (62135596800.0))
Run Code Online (Sandbox Code Playgroud)
但是,事情是这样的。其输出FROM_UNIXTIME()会隐式转换为您的本地时间。当您存储此数据时,您可能希望保留 UTC 时间。
有两种方法可以做到这一点。一种是使用TIMESTAMP数据类型来存储这些转换后的时间。另一种方法是在执行此转换操作之前将 MySQL 会话时间戳设置为“UTC”,如下所示:
SET time_zone = 'UTC';
Run Code Online (Sandbox Code Playgroud)
这是做同样事情的另一种方法,但不依赖于使用 Unix 时间戳。(这些时间戳仅在 1970 年至 2038 年期间有效。)这取决于将刻度转换为天,然后将余数转换为秒。它将刻度直接转换为 DATETIME 数据类型。
select FROM_DAYS(365+(yourcolumn / 864000000000))
+ INTERVAL (yourcolumn % 864000000000) / 10000000 SECOND
Run Code Online (Sandbox Code Playgroud)
常量 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获取完整的时间戳。| 归档时间: |
|
| 查看次数: |
2194 次 |
| 最近记录: |