我正在使用API从我的客户端收集一些数据。但订单日期的格式为06/09/2016 07:30 PM UTC
目前我只是将数据放入我的MYSQL表并将其存储为Varchar,现在一切正常,但我想使用select(日期范围)运行一些查询
我已经尝试更改表结构,因此列是Date而不是varchar,但是日期以所有00000000的
列出来我可以使用外卡返回记录,但不能在日期范围内返回。
我正在考虑从最后修改我不需要的数据然后放入新表
任何关于最佳进展方式的建议都将受到赞赏。
感谢。
答案 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)
我强烈建议有几件事情。
这背后的原因是MySQL在进行Date-math时做了很多优化。幸运的是,您仍然可以以YYYY-MM-DD的格式插入/更新字段。但是,为了解决将VARCHAR转换为有效DATETIME的问题,我将执行以下步骤:
UPDATE myTable SET newField = STR_TO_DATE(oldField, "%d/%m/%Y %h:%i%p");
就像我说的,MySQL做了很多不同的优化来帮助Date-math。这也允许你做第二部分......
使用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 []>