在格式不合格的日期之间转换(更改/斜杠/到-dash-)

时间:2011-11-15 12:28:00

标签: php mysql database date

我正在从一个有很多不一致的旧应用程序重建Web应用程序。我必须将旧数据库中的所有数据迁移到新结构中。

在旧数据库中,日期作为VARCHAR存储在MySQL DB中。 我们的总部设在英国,所以约会的日期是DD / MM / YYYY 。我需要将这些日期转换为MySQL的原生DATE()格式。

问题是这个 - PHP默认假设日期采用'美国'格式(MM / DD / YYYY),因为它们最初是用/而不是-分割的 - 而{{1}强制PHP假设它们是“欧洲”格式。

到目前为止,我这样做是为了转换它们:

-

其中$start_date = date('Y-m-d', strtotime($query->row('startdate'))); 是旧数据库中存储日期的列。问题是,我需要先将所有$query->row('startdate')切换为21/03/1994

我该怎么做?

5 个答案:

答案 0 :(得分:7)

$start_date = date('Y-m-d', strtotime(str_replace('/', '-', $query->row('startdate'))));

或者更好 - 只需更改数据库中的数据:

UPDATE `table` SET `startdate` = REPLACE(`startdate`, '/', '-');

...然后将字段转换为DATE类型。

----编辑----

实际上,Shrapnel上校有一点......我忽略了日期需要逆转的事实,所以它是YYYY-MM-DD;假设原始日期的格式为DD / MM / YYYY,则更好的查询可能类似于:

UPDATE `table` SET `date` = CONCAT(SUBSTRING(`date`, 7), '-', SUBSTRING(`date`, 4, 2), '-', SUBSTRING(`date`, 1, 2))

将组件部分反转为可以转换为DATE的字符串...如果原始日期字符串不使用前导零1/6/2011,它将无法正常工作...在这种情况下需要做一些更聪明的事情。

答案 1 :(得分:2)

当你需要一个最简单的2个移动长度的字符串操作时,为什么还要花费所有这些日期时间?

$tmp  = explode("/",$query->row('startdate'));
$date = "$tmp[2]-$tmp[1]-$tmp[0]";

但是,正如克里斯所说,你不必在这个操作中涉及PHP,因为你可以使用查询中使用类似字符串操作的单个SQL查询来转换它。

答案 2 :(得分:1)

MySQL有一个Replace()函数,可能是最简单的方法。

这是5.0 API参考: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_replace

答案 3 :(得分:0)

像这样使用str_replace

$start_date = date('Y-m-d', strtotime(str_replace('-','/',$query->row('startdate'))));

这当然是丑陋而快速的解决方案 - YMMV。

答案 4 :(得分:0)

如果你被绑定到PHP,为什么不解析数据,将其标准化然后继续?例如。与sscanf

$r = sscanf($varcharDate, '%d/%d/%d', $day, $month, $year);
if ($r !== 3)
{
    throw new Exception(sprintf('Invalid date format given: %s', $varcharDate));
}