Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 将12/20/2013 10:33 AM转换为DATETIME fortmat的SQL命令_Mysql_Datetime - Fatal编程技术网

Mysql 将12/20/2013 10:33 AM转换为DATETIME fortmat的SQL命令

Mysql 将12/20/2013 10:33 AM转换为DATETIME fortmat的SQL命令,mysql,datetime,Mysql,Datetime,我搜索了一个SQL命令来转换这种类型的格式,但最接近我看到的是STR_to_DATE。读到这篇文章时,我不知所措 情况: 我有一个考勤程序,可以下载员工扫描手指时的姓名和时间戳 在这个程序中没有选项以MYSQL使用的DATETIME格式格式化日期,否则我现在就不在这里了 相反,它将一列存储为“m/d/yyyy h/m AM/PM” 我曾想过可能会尝试编写一个php脚本,该脚本将转换并使用Explode for“”来分隔日期和时间,但在试图理解STR_to_date时,我又一次不知所措 如果能为我

我搜索了一个SQL命令来转换这种类型的格式,但最接近我看到的是STR_to_DATE。读到这篇文章时,我不知所措

情况:

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

在这个程序中没有选项以MYSQL使用的DATETIME格式格式化日期,否则我现在就不在这里了

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

我曾想过可能会尝试编写一个php脚本,该脚本将转换并使用Explode for“”来分隔日期和时间,但在试图理解STR_to_date时,我又一次不知所措

如果能为我指出正确的方向,我将不胜感激。

您将需要

 STR_TO_DATE('12/20/2013 10:33 PM', '%m/%d/%Y %h:%i %p')
这将获取date的特定布局,并将其转换为DATETIME表达式

理解STR_to_DATE的诀窍是理解DATE_格式的格式代码。你说得很对,它很模糊

看这个

将此类时间数据存储在DATETIME数据类型的列中非常重要,因为DATETIME列可以被索引并用于有效的范围扫描查找。大多数生产系统总是将此信息存储在DATETIME(有时是TIMESTAMP)列中,并在检索时使用DATE_格式或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
<?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");
?>
您也可以这样做:

  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')

您可以使用php DateTime这样做:

  CREATE TABLE copyscan AS  SELECT * FROM scan
<?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");
?>

我现在不能测试这个,但它可以工作

如果没有前导0,可能需要
%l
而不是
%h
持续数小时。这些前导/无前导差异仅适用于日期\u格式;和你约会更宽容。例如,
STR\u TO\u DATE('12/20/2013 9:3 PM','%m/%d/%Y%h:%i%p')
工作正常。好的,我想我理解STR\u TO\u DATE的基本含义。右边的%告诉STR_TO_DATE字符串是如何格式化的,这样它就知道如何将字符串转换为DATETIME格式。我对我的问题没有我应该做的那么精确。我也不明白的是,如何调用该命令(例如,我想将该列中的每一行更改为正确的格式)。我有200多行的格式都不正确。以上内容特定于该字符串。运行一个选择每一行的查询,然后更新该行并继续?另一个想法是:如果我在已经创建的表中添加一个新列。将该类型设置为DATETIME。然后,我可以使用Philip G给出的下面的答案,并使用UPDATE MYSQL命令输入正确的格式,然后让我的页面调用新列中要调用的信息。如果这是我的最佳选择,你有什么想法吗?似乎是我可以做的事情,因为我对PHP比MYSQL更熟悉:)任何适合你的事情都是最好的。除了这个例外:搜索DATETIME值要比搜索任意格式的日期字符串有效得多,因为它们可以被索引。没有任何迹象表明OP使用PHP。除了他写道他曾考虑使用explode编写PHP脚本,所以我给他做了一个不那么暴力的方法我想做的就是创建一个php页面,在这里我输入表名,然后php页面会将sTime列中的每个字段从考勤程序保存原始信息的不正确字符串转换成DATETIME格式。如果有一个MySQL命令可以做到这一点,这也是我会考虑的一个选项。不过我刚刚意识到,我确实需要将列类型更改为DATETIMEWill来测试此代码和/或更改,以便ti适合我的应用程序。谢谢。我的代码一定是出了什么问题。我已经将新列设置为VarChar(20)以使用Ollies代码进行测试,但仍然不起作用。所以我尝试了你的代码,同样的结果是错误的。当我发现哪里出了问题时,我会发布我的结果。我甚至将Update查询移到远离alter的地方,以确保有时间添加列,然后进行更新。表存在,列存在$t2=mysql_结果($n1result,$n1i,“sTime”)$时间戳=新的日期时间(“@”.strotime($t2,time())$newTime=$timestamp->format(“Y-m-dh:i:s”)$tq=“UPDATE$repd SET nTime='$newTime',其中id='$t1';好的,找到问题了$tq=“更新
$repd
设置nTime='$newTime',其中id=$t1”;在$repd周围有一个备用撇号,去掉$t1周围的常规撇号,这样就行了。使用PHP设置,现在看看我是否可以让STR_to_DATE也这样做:)谢谢大家的帮助。STR_to_DATE正在工作$tq=“UPDATE
$repd
将nTime=STR设置为日期(“$t2”,“c/%e/%Y%l:%i%p”),其中id=$t1”;同样的,只有$repd附近有一个替代撇号,其他所有内容都按原样显示。希望这能帮助那些在日期时间方面有相同问题的人,显然现在更新工作正常:)