8

我在 MySQL DB 中有下表:

year | day_of_year
2012 | 283.813090

如何转换这些字段DateTime

我试过了:

SELECT MAKEDATE(year, day_of_year) from tableName;

它返回Dateyyyy-mm-dd)...我怎样才能得到Time(hh:mm:ss)?

谁能帮我解决这个问题?

4

2 回答 2

6

通过使用 MySQL 的SEC_TO_TIME()函数(和一点数学),您将能够获得您的时间戳。

所涉及的数学运算是将您的day_of_year列乘以一天中的秒数 86400,然后对 86400 进行模运算,得到等式((day_of_year * 86400) % 86400)

SELECT SEC_TO_TIME((day_of_year * 86400) % 86400) AS time;

如果我用 value 运行283.813090它,它会给我正确的时间*:

mysql> SELECT SEC_TO_TIME((283.813090 * 86400) % 86400) AS time;
+----------+
| time     |
+----------+
| 19:30:51 |
+----------+

要将其与实际日期结合起来,您可以在两个单独的列中选择它们或使用CONCAT()来获取真正的“时间戳”:

SELECT
    CONCAT(MAKEDATE(year, day_of_year), ' ', SEC_TO_TIME((day_of_year * 86400) % 86400)) AS timestamp
FROM tableName;

* 时间计算背后的数学相当简单。对于283.813090,这表示有 283 天。为了计算时间,我们使用小数部分并乘以 24(小时数)。.813090 * 24 = 19.51416. 这说有19个小时;为了计算分钟,我们取它的小数部分并乘以 60. .51416 * 60 = 30.8496,即 30 分钟。对于秒数,再次取小数部分并乘以 60: .8496 * 60 = 50.976。因此,我们总共有 19 小时 30 分 50 秒(0.976 毫秒,四舍五入)- 19:30:51 或晚上 7:30。

于 2012-10-20T04:49:18.357 回答
2

这是我提出的查询:

SELECT TIMESTAMP(
                 MAKEDATE(year, day_of_year),
                 SEC_TO_TIME((1 - (round(day_of_year) - day_of_year)) * 24 * 60 * 60))
FROM tableName;

这是什么?

1 - (round(day_of_year) - day_of_year)=> 获得小数部分 (.813090)

24 * 60 * 60=> 1 天内的总秒数 = 24 小时 * 60 分钟 * 60 秒

测试

您可以在此处使用 SQL Fiddle 处理查询:http ://sqlfiddle.com/#!2/f62619/21

结果

这些是您在问题中提供的两个样本的结果:

October, 10 2012 19:30:51+0000
October, 10 2012 20:15:23+0000

参考

这些是帮助我构建查询的好资源:

12.7。日期和时间函数
如何在 MySQL 中添加日期或时间值

于 2012-10-20T04:48:56.963 回答