我有一个关于 MySQL 中时间字段的奇怪问题。
在数据库中我们有 2 个字段:date
和 time
。数据如下所示:
+-----------------------+
| date | time |
+-----------------------+
|27/04/2017| 11:30 |
+-----------------------+
|01/05/2017| 20u |
+-----------------------+
|02/05/2017| 20u30 |
+-----------------------+
|03/05/2017| 21h |
+-----------------------+
这个数据是什么意思?嗯:
- 20u 是 20:00
- 20u30 是 20:30
- 21h 是 21:00
主要问题是由于某些原因我必须保持所有这些数据不变,并且必须找到正确显示数据的解决方案,并从中获取 unix 时间戳或正确的日期或匹配正确的日期。
为了让您了解我需要什么,Query what used 的一些旧部分如下所示:
UNIX_TIMESTAMP(CONCAT(DATE_FORMAT(STR_TO_DATE(`date`,'%d/%m/%Y'),'%Y-%m-%d'),' ',`time`))
但是在匹配正常情况下失败了。
我编写了一个 PHP 函数用于在代码的某些部分显示正确的时间,如下所示:
function bo_time($string)
{
if(preg_match("/(\d{1,2})(u|h)/Ui",$string, $match))
{
$string = sprintf("%s:%s", sprintf('%02d', $match[1]), '00' );
}
else if(preg_match("/(\d{1,2})(u|h|\:)(\d{2})/Ui",$string, $match))
{
$string = sprintf("%s:%s", sprintf('%02d', $match[1]), ( isset($match[3]) ? sprintf('%02d', $match[3]) : '00' ));
}
return $string;
}
使用该 PHP 函数,系统的某些部分可以正常工作,但在系统的某些部分,我可以按日期/时间在表之间进行匹配,但一切都会失败并崩溃。
我的主要问题是:
有没有办法像我在 PHP 中那样编写一些正则表达式来转换 MySQL 查询中的时间?
谢谢!
最佳答案
我创建了一个似乎有效的查询,至少对于您提供给我们的数据而言。它只需要一些逻辑来处理数据的各种边缘情况。我将您的时间数据转换为实际的时间戳时间字符串,然后与日期连接,也转换为 ISO 格式。有了正确的日期和时间,我们就可以调用 UNIX_TIMESTAMP
在此时间戳字符串上获取所需的数据。
SELECT
date, time, UNIX_TIMESTAMP(CONCAT(date, ' ', time)) AS ts
FROM
(
SELECT
CONCAT(RIGHT(date, 4), '-', SUBSTRING(date, 4, 2), '-',
LEFT(date, 2)) AS date,
CASE WHEN time REGEXP '.*[uh]$'
THEN CONCAT(LEFT(time, CHAR_LENGTH(time) - 1), ':00:00')
ELSE CONCAT(REPLACE(REPLACE(time, 'h', ':'),
'u', ':'), ':00') END AS time
FROM yourTable
) t;
输出:
此处演示:
Rextester
关于php - MySQL:在查询中使用特殊的正则表达式规则修复时间格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47119972/