【问题标题】:Dealing with poorly formatted times处理格式错误的时间
【发布时间】:2014-01-09 16:39:16
【问题描述】:

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

例如:

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 to 4 PM”等值。

【问题讨论】:

  • 那么新格式是什么样的?您基本上展示了四种不同类型的当前格式,因为这些都是您正在处理的?

标签: php mysql sql formatting


【解决方案1】:

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

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

当然,“h:i”可以是您喜欢的任何格式。

【讨论】:

  • 我不确定这是否可行...很多字段包含以下内容:“12:00 PM - 1:00 PM”或“3 PM to 4 PM”,等
  • 我会运行它并将新时间插入另一个字段。然后查询其中有多少返回 1969-12-31。如果它是一个合理的数字,您可以单独对它们执行一些正则表达式。他们中的大多数已经有数字条目这一事实不是问题,因为 strtotime 仍然会转换它们。我不知道你是否能一口气把它们全部搞定,但我会尽量用简单的方法搞定,然后看看你在哪里。
  • 感谢您的帮助。如果你不介意我问,为什么是“1969-12-31”?
【解决方案2】:

我不是 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

【讨论】:

    猜你喜欢
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 2021-03-01
    • 2013-12-17
    • 2015-04-19
    相关资源
    最近更新 更多