今天我正在寻找一些帮助,我正在对我的数据库进行更新。在我们内部系统的先前版本中,我们使用以下样式字符串作为系统日志;
User Admin Logged in from xx.xx.xx.xx - 24/05/2014 - 12:26PM
所有时间都以如上所示的单个字符串写入数据库,但是我希望对系统进行现代化并使用时间戳,以便可以对它们进行搜索。数据库中有数千条记录,所有记录都带有上述时间标记。
我正在寻找帮助打破字符串,提取时间然后将其转换为时间戳,然后将其保存到数据库。
到目前为止,我已尝试手动使用以下内容,以查看结果;
strtotime($string . " UTC+10");
使用诸如'now','today'和'June 31st'这样的术语似乎有效,但是'24 / 05/2014 - 12:26 PM'的字符串不起作用。
除了这个问题之外,我注意到日期信息之间使用/会强制脚本将其读作mm / dd / yyyy而不是dd / mm / yyyy
建议的方法是什么,记住我想从数据库中提取这些内容,获取时间戳,然后自动将其保存回数据库。服务器负载不是问题,因为它只需要发生一次。
一如既往地谢谢你。)
我根据提供的答案使用以下代码来快速有效地完成此操作。希望它能帮助别人!
<?php
require_once("config.inc.php");
$ProcessText = '';
$QueryCount = 0;
$sql = mysql_query("SELECT UNIX_TIMESTAMP(STR_TO_DATE(RIGHT(log,20), '%d/%m/%Y - %h:%i%p')),dbid FROM systemlogs WHERE `timestamp` = '';");
while($data = mysql_fetch_array($sql)){
$doupdate = mysql_query("UPDATE `systemlogs` SET `timestamp` = '".$data[0]."' WHERE `dbid` = '".$data[1]."' LIMIT 1");
$ProcessText .= 'Updated: '.$data[1].' | Set Timestamp: '.$data[0];
$QueryCount++;
}
//echo $ProcessText;
echo '<strong>Total Queries Run: '.$QueryCount.'</strong>';
?>
答案 0 :(得分:3)
因此,如果您正在寻找数据库解决方案并且它是mySQL,您可以使用以下方法构建更新语句:
select UNIX_TIMESTAMP( STR_TO_DATE('24/05/2014 - 12:26PM', '%d/%m/%Y - %h:%i%p') );
您要做的是使用SUBSTR或其他一些函数从您存储此日志信息的列中获取时间戳部分,然后像上面那样进行转换,然后使用UPDATE语句结合选择。
以下是一个完整的例子:
create database so1;
use so1;
create table logs ( old varchar(128), new bigint(20));
INSERT INTO logs (old) VALUES ('User Admin Logged in from xx.xx.xx.xx - 24/05/2014 - 12:26PM');
INSERT INTO logs (old) VALUES ('User Admin Logged in from xx.xx.xx.xx - 24/05/2014 - 12:27PM');
INSERT INTO logs (old) VALUES ('User Admin Logged in from xx.xx.xx.xx - 24/05/2014 - 12:28PM');
update logs a left join (SELECT UNIX_TIMESTAMP ( STR_TO_DATE( RIGHT(old, 20), '%d/%m/%Y - %h:%i%p') ) as new, old FROM logs) b on a.old=b.old set a.new = b.new;
工作原理:
我假设您的日志字符串最后20个字符始终是您尝试获取的时间戳。因此,SQL函数RIGHT(str,n)
将返回某些n
数据的最右侧str
个字符。在这种情况下,我的示例中为old
列。
所以:RIGHT('User Admin Logged in from xx.xx.xx.xx - 24/05/2014 - 12:26PM', 20)
将返回24/05/2014 - 12:26PM
接下来,我们需要将该字符串转换为mysql可以理解的时间。 mySQL函数STR_TO_TIME
就是为此而创建的。它需要两个参数:第一个是你要转换的字符串(我们的RIGHT
函数的输出,然后第二个参数是将要解析的格式。在这种情况下,{{1} },你可以找到一个list of what each of those mean here但它的日/月/年是一个空格和破折号,然后是小时colin,分钟AM | PM。所以,mySQL会把你的字符串转换成它。如果你刚运行%d/%m/%Y - %h:%i%p
+ STR_TO_TIME
您将获得一个日期时间列,但您说您想要一个时间戳......
所以最后我们进入转换的最后一步,简单地要求mySQL将datetime对象转换为带有RIGHT
的时间戳。而且,这就是你想要的价值。
接下来是实际更新,这样你就可以在一次扫描中完成所有这些操作。对于mySQL存在称为“更新连接”的东西(我相信大多数sql)。语法是:
UPDATE table1 LEFT JOIN table2 ON .field = .field SET .somefield =
因此,我们希望更新我们的日志表(在示例中),并对列进行转换。因此,我们使用表格和转换结果执行JOIN。为了加入表格并确保匹配,我们也会从新结果中提取UNIX_TIMESTAMP
列。这是代码中的很多单词:
old
我省略了查询以获取结果,以便您可以更轻松地查看更新语法。所以我们在这一点之后需要的是结果本身加入反对,使用上面的转换过程,以及我们需要让旧列加入我们组合的事实:
UPDATE logs a
LEFT JOIN (...) b ON a.old=b.old
SET a.new = b.new;
和更新查询以获得最终结果:
SELECT UNIX_TIMESTAMP(STR_TO_DATE(RIGHT(old,20), '%d/%m/%Y - %h:%i%p')) AS new, old FROM logs