我搜索过一个SQL命令来转换这种格式,但我最近看到的是STR_TO_DATE。阅读时,我感到很茫然。
情况:
我有一个考勤计划,可以下载员工扫描手指时的姓名和时间戳。
此程序中没有选项可以格式化MYSQL使用的DATETIME格式的日期,否则我现在不会在这里。
相反,它存储一列,“m / d / yyyy h / m AM / PM”。
我想过可能会尝试编写一个可以转换的PHP脚本并使用Explode来分隔日期和时间,但在尝试理解STR_TO_DATE时我又一次感到茫然。
如果我能指出正确的方向,那将非常感激。
答案 0 :(得分:2)
你需要
STR_TO_DATE('12/20/2013 10:33 PM', '%m/%d/%Y %h:%i %p')
这将获取日期的特定布局,并将其转换为DATETIME表达式。
理解STR_TO_DATE的技巧是理解DATE_FORMAT的格式代码。你是完全正确的,这是不明确的。
看到这个。 http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format
将此类时间数据存储在具有DATETIME数据类型的列中非常重要,因为可以对DATETIME列进行索引并将其用于有效的范围扫描查找。大多数生产系统始终将此信息存储在DATETIME(或有时是TIMESTAMP)列中,并在使用DATE_FORMAT或php等主机语言检索到所需的显示格式时将其转换。
如果你有一个现有的表,我们称之为“scan”,你可以添加一个名为“scantimestamp”的DATETIME列,然后按如下方式填充它。
UPDATE scan SET scantimestamp = STR_TO_DATE(`Timestamp`, '%m/%d/%Y %h:%i %p')
这将修复整个表格。然后你可以删除旧列。
首先在表的副本上执行此操作以确保不会弄乱它,您可以复制这样的表:
CREATE TABLE copyscan AS SELECT * FROM scan
你也可以这样做:
CREATE TABLE betterscan AS
SELECT Name,
STR_TO_DATE(`Timestamp`, '%m/%d/%Y %h:%i %p') AS scantime
FROM scan;
RENAME TABLE scan TO oldscan;
RENAME TABLE betterscan TO scan;
当您在改进的表中插入新行时,您可以使用这样的预准备语句,并且您的时间戳将在插入时进行规范化。
INSERT INTO scan
(`Name`, scantimestamp)
VALUES (?, STR_TO_DATE(?, '%m/%d/%Y %h:%i %p')
答案 1 :(得分:0)
您可以使用php DateTime执行此操作:
<?php
$date = "09/19/2013 10:33 AM";
//Your timezone
date_default_timezone_set("Europe/Stockholm");
$timestamp = new DateTime("@" . strtotime($date, time()));
$timestamp->setTimezone(new DateTimezone("Europe/Stockholm"));
//echos you specified format
echo $timestamp->format("Y-m-d H:i:s");
?>
EDIT添加了mysql循环
$sql = new mysqli('localhost','username','password','database');
$result = $sql->query("SELECT ID, sTime FROM table");
while ($row = $result->fetch_object()){
$date = $row->sTime;
date_default_timezone_set("Europe/Stockholm");
$timestamp = new DateTime("@" . strtotime($date, time()));
$timestamp->setTimezone(new DateTimezone("Europe/Stockholm"));
//echos you specified format
$newTime = $timestamp->format("Y-m-d H:i:s");
//Updates format for that row
$sql->query("UPDATE table SET sTime='" . $newTime . "' WHERE ID='" . $row->ID . "'");
}
我现在无法对此进行测试,但它可以正常工作。