MYSQL日期在

时间:2016-06-09 20:43:19

标签: php mysql date

我正在使用API​​从我的客户端收集一些数据。但订单日期的格式为06/09/2016 07:30 PM UTC

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

我已经尝试更改表结构,因此列是Date而不是varchar,但是日期以所有00000000的

列出来

我可以使用外卡返回记录,但不能在日期范围内返回。

我正在考虑从最后修改我不需要的数据然后放入新表

任何关于最佳进展方式的建议都将受到赞赏。

感谢。

3 个答案:

答案 0 :(得分:1)

使用

select str_to_date(date_column, '%d/%m/%Y %h:%i%p')
from your_table

将其转换为日期:Example

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

update your_table
set new_date_column = str_to_date(old_date_column, '%d/%m/%Y %h:%i%p')

然后删除旧列并重命名新列。

请参阅here了解如何设置日期字符串的格式。

答案 1 :(得分:0)

我强烈建议有几件事情。

将字段更改为DateTime

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

  1. 创建新字段,将其称为其他内容。
  2. 执行表的更新,并将所有旧值保存到新列中。例如:
  3. UPDATE myTable SET newField = STR_TO_DATE(oldField, "%d/%m/%Y %h:%i%p");

    1. 删除旧列并将新列重命名为旧名称。
    2. 就像我说的,MySQL做了很多不同的优化来帮助Date-math。这也允许你做第二部分......

      BETWEEN是你的朋友

      使用BETWEEN关键字可以节省大量时间,并且还可以进行大量优化。所以你可以很容易地做到以下几点:

      SELECT * FROM myTable WHERE myDate BETWEEN "2016-01-01" AND "2016-05-05";

      希望这有帮助!

答案 2 :(得分:0)

您也可以像这样使用虚拟持久性列。所以你可以把你的日期存储为字符串,MySQL直接将它转换为DATETIME。因此,您可以将新字段用于BETWEEN,也可以在新字段上创建INDEX

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;

<强>样品

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 []>