帮助!我的数据库中的一列用于日期。不幸的是,我所有的日期都是字符串形式(YYYY.MM.DD)。我有一个 MASSIVE 数据库(300+GB),所以理想情况下希望避免转换。
有没有办法可以为 YYYY.MM.DD 和 YYYY.MM.DD 之间的日期选择行?脚本会是什么样子?
谢谢!
帮助!我的数据库中的一列用于日期。不幸的是,我所有的日期都是字符串形式(YYYY.MM.DD)。我有一个 MASSIVE 数据库(300+GB),所以理想情况下希望避免转换。
有没有办法可以为 YYYY.MM.DD 和 YYYY.MM.DD 之间的日期选择行?脚本会是什么样子?
谢谢!
如果月份和日期以前导零存储,则 BETWEEN 运算符将按预期工作。ORDER BY 也是如此。
create table your_table (
date_value varchar(10) not null
);
insert into your_table values
('2013.01.01'), ('2013.01.13'), ('2013.01.30'), ('2013.01.31'),
('2013.02.01'), ('2013.02.13'), ('2013.02.28'), ('2013.02.31'),
('2013.03.01'), ('2013.03.15'), ('2013.03.30'), ('2013.03.31');
select date_value
from your_table
where date_value between '2013.01.01' and '2013-01-31'
order by date_value;
2013.01.01
2013.01.13
2013.01.30
您的结构的主要问题之一是您失去了类型安全性。看看这个查询。
select date_value
from your_table
where date_value between '2013.02.01' and '2013.02.31'
order by date_value;
2013.02.01
2013.02.13
2013.02.28
2013.02.31
如果您使用日期或日期时间或时间戳类型的列,则 dbms 将不允许插入值“2013.02.31”,因为这不是日期域中的值。它是varchar 域中的值。(“Arrrrgh!”也是如此,除非您对该列有 CHECK 约束,从而严重限制了可接受的值。)
不是很好的解决方案,但可以工作(花费很多性能)。
您已经按年、月、日的顺序格式化了日期(比较字符串的好顺序,没有转换为日期时间),所以您可以尝试
SELECT * FROM Table WHERE StringDate > '2013.07.10' AND StringDate < '2013.07.14'
如果 1000 年之前的日期没有前导零('999.07.14'),它会返回错误的结果。
但我不知道它如何在大数据库上工作。
Between
在 SQL 中包含两个边界。如果这是你想要的,你可以使用between
:
where col between 'YYYY.MM.DD' and 'YYYY.MM.DD'
这两个常量是您要查找的任何值。
如果列上有索引,那么between
(以及>
、>=
等)将使用该索引。您不需要转换这些值。如果您的常量是一种或另一种形式的日期,那么您可以使用date_format()
创建正确格式的字符串。例如,要获取过去一周内的日期:
where col >= date_format(adddate(now(), -7), '%Y.%m.%d')