SQL命令将12/20/2013 10:33 AM转换为DATETIME格式

时间:2014-01-21 18:02:25

标签: mysql datetime

我搜索过一个SQL命令来转换这种格式,但我最近看到的是STR_TO_DATE。阅读时,我感到很茫然。

情况:

我有一个考勤计划,可以下载员工扫描手指时的姓名和时间戳。

此程序中没有选项可以格式化MYSQL使用的DATETIME格式的日期,否则我现在不会在这里。

相反,它存储一列,“m / d / yyyy h / m AM / PM”。

我想过可能会尝试编写一个可以转换的PHP脚本并使用Explode来分隔日期和时间,但在尝试理解STR_TO_DATE时我又一次感到茫然。

如果我能指出正确的方向,那将非常感激。

2 个答案:

答案 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 . "'");
}

我现在无法对此进行测试,但它可以正常工作。