转换datetime mysql中的浮动日
我在MySQL数据库中有下表:转换datetime mysql中的浮动日,mysql,sql,date,time,Mysql,Sql,Date,Time,我在MySQL数据库中有下表: year | day_of_year 2012 | 283.813090 如何在DateTime中转换这些字段 我试过: SELECT MAKEDATE(year, day_of_year) from tableName; 从tableName中选择MAKEDATE(年、年中的天); 它返回日期(yyyy-mm-dd)。。。如何获取时间(hh:mm:ss) 有人能帮我解决这个问题吗?以下是我提出的问题: SELECT TIMESTAMP(
year | day_of_year
2012 | 283.813090
如何在DateTime
中转换这些字段
我试过:
SELECT MAKEDATE(year, day_of_year) from tableName;
从tableName中选择MAKEDATE(年、年中的天);
它返回日期(yyyy-mm-dd
)。。。如何获取时间(hh:mm:ss)
有人能帮我解决这个问题吗?以下是我提出的问题:
SELECT TIMESTAMP(
MAKEDATE(year, day_of_year),
SEC_TO_TIME((1 - (round(day_of_year) - day_of_year)) * 24 * 60 * 60))
FROM tableName;
这是什么?
1-(四舍五入(一年之日)-一年之日)
=>获取小数部分(.813090)24*60*60
=>一天中的总秒数=24小时*60分钟*60秒
测试
您可以在此处使用SQL FIDLE处理查询:
结果
以下是您在问题中提供的两个样本的结果:
October, 10 2012 19:30:51+0000
October, 10 2012 20:15:23+0000
参考资料
以下是帮助我构建查询的优秀资源:
通过使用MySQL函数(和一点数学),您将能够获得时间戳 所涉及的数学是将你的
年中的日
列乘以一天中的秒数86400,然后在86400上修改结果,得到等式((年中的日*86400)%86400)
:
如果我使用值283.813090
运行此命令,它将为我提供一天中的正确时间*:
mysql> SELECT SEC_TO_TIME((283.813090 * 86400) % 86400) AS time;
+----------+
| time |
+----------+
| 19:30:51 |
+----------+
要将其与实际日期结合起来,您可以在两个单独的列中选择它们,或者使用CONCAT()
来获得真正的“时间戳”:
*时间计算背后的数学相当简单。对于
283.813090
,这表示有283天。为了计算一天中的时间,我们使用分数部分乘以24(小时)<代码>0.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。我们如何将283.813090
解码为一个日期/时间?嗯,为什么有人会以这种编码方式存储:)?正确@新家具283是一年中的283º天。。。813090只是那天的一小部分。。。但是在另一个寄存器中,我有一个有效的时间,在一年中的第_天,值283.844016和.844016*24=20.256384?你是怎么得到时间的?@Vidkor exec查询我得到了日期“2012-10-10”,但我不知道如何转换时间…而不是(年份*86400)%86400
,为什么不干脆((年份楼层*年份*86400
)@NRohler有几种方法可以计算;我也可以使用(1-(年份*天)-day_of_year))*86400
。我使用我的方法是因为它(对我来说)更容易阅读,但你可以用你最喜欢的/首选的方法替换相同的结果。@newfurnity这是我无法做的数学!!!!谢谢!!!非常!!!!!
mysql> SELECT SEC_TO_TIME((283.813090 * 86400) % 86400) AS time;
+----------+
| time |
+----------+
| 19:30:51 |
+----------+
SELECT
CONCAT(MAKEDATE(year, day_of_year), ' ', SEC_TO_TIME((day_of_year * 86400) % 86400)) AS timestamp
FROM tableName;