0

帮助!我的数据库中的一列用于日期。不幸的是,我所有的日期都是字符串形式(YYYY.MM.DD)。我有一个 MASSIVE 数据库(300+GB),所以理想情况下希望避免转换。

有没有办法可以为 YYYY.MM.DD 和 YYYY.MM.DD 之间的日期选择行?脚本会是什么样子?

谢谢!

4

3 回答 3

2

如果月份和日期以前导零存储,则 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 约束,从而严重限制了可接受的值。)

于 2013-07-14T21:00:06.503 回答
1

不是很好的解决方案,但可以工作(花费很多性能)。

您已经按年、月、日的顺序格式化了日期(比较字符串的好顺序,没有转换为日期时间),所以您可以尝试

SELECT * FROM Table WHERE StringDate > '2013.07.10' AND StringDate < '2013.07.14' 

如果 1000 年之前的日期没有前导零('999.07.14'),它会返回错误的结果。

但我不知道它如何在大数据库上工作。

SQL小提琴

于 2013-07-14T20:43:35.607 回答
1

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')
于 2013-07-14T20:57:12.550 回答