Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.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
Php MYSQL日期选择_Php_Mysql_Date - Fatal编程技术网

Php MYSQL日期选择

Php MYSQL日期选择,php,mysql,date,Php,Mysql,Date,我正在使用API从我的客户机收集一些数据。然而,订单日期的格式为2016年9月6日UTC下午7:30 目前,我只是将数据放入MYSQL表中,并将其存储为Varchar,目前一切正常,但我希望使用select在日期范围内运行一些查询 我尝试更改表结构,使列为Date而不是varchar,但日期都是00000000 我可以使用通配符返回记录,但不能在日期范围内返回 我想从最后开始整理我不需要的数据,然后放到一个新表中 如能就最佳方式提出任何建议,将不胜感激 谢谢。使用 select str_to_d

我正在使用API从我的客户机收集一些数据。然而,订单日期的格式为2016年9月6日UTC下午7:30

目前,我只是将数据放入MYSQL表中,并将其存储为Varchar,目前一切正常,但我希望使用select在日期范围内运行一些查询

我尝试更改表结构,使列为Date而不是varchar,但日期都是00000000

我可以使用通配符返回记录,但不能在日期范围内返回

我想从最后开始整理我不需要的数据,然后放到一个新表中

如能就最佳方式提出任何建议,将不胜感激

谢谢。

使用

select str_to_date(date_column, '%d/%m/%Y %h:%i%p')
from your_table
要将其转换为日期:

您可以添加datetime类型的另一列并将值放在那里

update your_table
set new_date_column = str_to_date(old_date_column, '%d/%m/%Y %h:%i%p')
然后删除旧列并重命名新列


有关如何设置日期字符串的格式,请参阅。

我强烈建议您做几件事

将字段更改为日期时间 这背后的原因是MySQL在计算日期时做了很多优化。幸运的是,您仍然可以以YYYY-MM-DD格式插入/更新字段。但是,为了解决将VARCHAR转换为有效日期时间的问题,我将执行以下步骤:

创建一个新字段,将其命名为其他名称。 更新表,并将所有旧值保存到新列中。前任: 将myTable SET newField=STR\u更新为\u DATEoldField,%d/%m/%Y%h:%i%p

删除旧列并将新列重命名为旧名称。 就像我说的,MySQL做了很多不同的优化来帮助进行日期计算。这也允许你做这个的第二部分

你的朋友是谁 使用关键字BETWEEN可以节省大量时间,而且它还经过了大量优化。因此,您可以非常轻松地执行以下操作:

从myTable中选择*,其中myDate介于2016-01-01和2016-05-05之间


希望这有帮助

您还可以像这样使用虚拟持久列。因此,您可以将日期存储为字符串,并直接将其转换为DATETIME。因此,您可以将新字段用于BETWEEN,也可以在新字段上创建索引

CREATE TABLE `dd` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `utc` VARCHAR(32) DEFAULT NULL,
  `nd` DATETIME AS (STR_TO_DATE(utc, '%d/%m/%Y %h:%i%p') ) persistent,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
样品


非常感谢,我错过了Mysql手册日期时间表中的%p。谢谢。在我看到数据被存储为varchar而不是date之前,我尝试使用的是通配符,而在两者之间显然不起作用。我会将所有旧数据转换为一个新的列,以便于选择查询。再次感谢您,我会使用上面回答的示例转换所有旧数据,但我会使用您的建议更改我将数据拉入的表,这样在转换旧数据后,我就不必再更改任何其他内容。再次感谢。尝试运行示例表代码1064时出现此错误-您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解使用near“AS STR_to_DATEutc,“%d/%m/%Y%h:%i%p”的正确语法,第4行的“持久主键id”在我看来都不错,但我已经查看了数小时的查询,它是否在您的计算机上运行?是否可能没有旧的MySQL/MariaDB版本。请发布结果:选择版本;从您的表格中选择str_to_datedate_列,'%d/%m/%Y%h:%i%p',它不是str_to_date,它是自动计算字段的虚拟持久字段
MariaDB []> CREATE TABLE `dd` (
    ->   `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
    ->   `utc` VARCHAR(32) DEFAULT NULL,
    ->   `nd` DATETIME AS (STR_TO_DATE(utc, '%d/%m/%Y %h:%i%p') ) persistent,
    ->   PRIMARY KEY (`id`)
    -> ) ENGINE=INNODB DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.30 sec)

MariaDB []> INSERT INTO `dd` (`utc`)
    -> VALUES
    -> ('06/09/2016 07:30PM UTC');
Query OK, 1 row affected, 1 warning (0.13 sec)

MariaDB []> select * from dd;
+----+------------------------+---------------------+
| id | utc                    | nd                  |
+----+------------------------+---------------------+
|  1 | 06/09/2016 07:30PM UTC | 2016-09-06 19:30:00 |
+----+------------------------+---------------------+
1 row in set (0.00 sec)

MariaDB []>