处理格式不佳的时间

时间:2014-01-09 16:39:17

标签: php mysql sql formatting

我的公司在其网站上有一个页面,其中包含开始时间的文本输入字段。现在他们需要我将表单转换为使用选择而不是时代。因为到目前为止,插入数据库的时间来自文本输入,所以没有时间格式化数据库中的行共享的约定。

例如:

mysql> SELECT classtime FROM classes LIMIT 10;
+-----------+
| classtime |
+-----------+
| 3PM       |
| 9:30am    |
| 9:00am    |
| 9:30am    |
| 3:00pm    |
| 10:00am   |
| 3:00      |
| 10:30     |
| 11:30     |
| 9         |
+-----------+
10 rows in set (0.02 sec)

这些只是约45,000行中的10个。

我正在尝试编写处理逻辑,该逻辑将显示原始数据以及新的限制格式数据。显然,我需要写一个条件来区分这两者,但我似乎无法想出一个解决它的好方法。由于新数据在插入数据库之前将使用strtotime()进行转换,我最初的想法是编写一个条件来检查从数据库中检索的数据是否为数字,然后相应地显示。

唯一的问题是许多行已经包含具有数字格式时间的时间字段:

mysql> SELECT COUNT(*) FROM classes WHERE classtime REGEXP '^[0-9]*$';

+----------+
| count(*) |
+----------+
|      273 |
+----------+
1 row in set (0.07 sec)

如您所见,此方法无效。有人有什么建议吗?提前谢谢。

编辑(附加信息): 许多字段还包含以下值:“12:00 PM - 1:00 PM”或“3 PM到4 PM”等。

2 个答案:

答案 0 :(得分:0)

您可以在PHP中使用strtotime()函数来转换它们中的大部分。

$new_time = date('h:i', strtotime($old_time));

当然,'h:i'可以是您想要的任何格式。

答案 1 :(得分:0)

我不是一个PHP人,而是从数据库的角度来看这个。在您的查询中,您可以非常轻松地格式化您列出的所有时间,但您在上面评论中提到的范围需要先清理或拆分。

DECLARE @BadFormatTimes TABLE
(
  badTime VARCHAR(20)
)

INSERT INTO @BadFormatTimes (badTime) VALUES ('3PM')
INSERT INTO @BadFormatTimes (badTime) VALUES ('9:30am')
INSERT INTO @BadFormatTimes (badTime) VALUES ('9:00am')
INSERT INTO @BadFormatTimes (badTime) VALUES ('9:30am')
INSERT INTO @BadFormatTimes (badTime) VALUES ('3:00pm')
INSERT INTO @BadFormatTimes (badTime) VALUES ('10:00am')
INSERT INTO @BadFormatTimes (badTime) VALUES ('3:00')
INSERT INTO @BadFormatTimes (badTime) VALUES ('10:30')
INSERT INTO @BadFormatTimes (badTime) VALUES ('11:30')
INSERT INTO @BadFormatTimes (badTime) VALUES ('9')
INSERT INTO @BadFormatTimes (badTime) VALUES ('12:00 PM - 1:00 PM') -- This will fail
INSERT INTO @BadFormatTimes (badTime) VALUES ('3 PM to 4 PM') -- This will fail 

-- Run update script to clean up time ranges or split and format

SELECT 
 badTime 'Bad Time',
 CAST(badTime AS time(0)) AS 'Clean Time' 
FROM @BadFormatTimes