我在 MySQL DB 中有下表:
year | day_of_year
2012 | 283.813090
如何转换这些字段DateTime
?
我试过了:
SELECT MAKEDATE(year, day_of_year) from tableName;
它返回Date
(yyyy-mm-dd
)...我怎样才能得到Time
(hh:mm:ss)?
谁能帮我解决这个问题?
通过使用 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。
这是我提出的查询:
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
参考
这些是帮助我构建查询的好资源: