我正在从一个有很多不一致的旧应用程序重建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
。
我该怎么做?
答案 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));
}