2012-02-29 61 views
1

我有以下问题:两个日期列,一个日期。我如何获取数据?

在mysql中,我有一个表,其中包含两个日期列start_date和end_date。日期格式为yyyy-mm-dd。我想要做的是从特定日期的所有行中获取所有数据,可以说'2012-03-05'列出了这些日期列之一或之间的内容。

如何创建一个很好的获取所需数据的sql查询?我已经检查了两者之间的关系,但我不确定这是否是最好的选择。我想这通常是一个简单的任务,但我无法找出一个好的查询。

谢谢。

+0

我想我可以做类似SELECT * FROM测试,其中起始日期<= '2012-03-05' 日期和结束日期> =“2012- 03-05' 。但是有更好的方法吗? – Ms01 2012-02-29 21:53:29

+0

如果与'start_date' /'end_date'的间隔结束,通常只有其中一个包含*; *另一个是*独占*。这样做是为了确保多个记录不匹配具有相同日期的查询。哪一个是包容性的,哪一个不依赖于你的数据库设计。 – dasblinkenlight 2012-02-29 22:01:38

回答

4
SELECT * FROM table WHERE start_date <= '2012-02-29' AND end_date >= '2012-02-29'; 

应该这样做。

+0

谢谢,我只是想过这个模型。它需要一段时间才能沉没下来。 :) – Ms01 2012-02-29 21:54:32

+0

没问题。很高兴我能帮上忙 :)。 – Corbin 2012-02-29 21:55:16

+0

这也会做到这一点,但如果你要从** TABLE **中选择一些东西,你会得到一个语法错误;-) – halfer 2012-03-01 00:09:37

3

这是一种使用日期范围来构建表格的非常常见的方法,特别是在temporal database设计中。它可以让你非常有效地执行基于范围的查询,假设两列的索引都存在。您查询的数据是这样的:

select * 
from mytable t 
where t.start_date <= @desired_date and t.endDate > @desired_date 

@desired_date是您想查询,例如日期'2012-03-05'。

注意<=在另一面,>在另一面,没有=。这样做是为了确保起始范围定义非重叠间隔。

2

不知道,尝试是这样的:

SELECT 
    * 
FROM 
    mytable 
WHERE 
    '2012-03-05' BETWEEN start_date AND end_date 
2
SELECT * FROM mytable 
WHERE '2012-03-05' BETWEEN start_date AND end_date; 
+0

哦,同样的'。拥有+1! – halfer 2012-02-29 21:54:32

+0

我最喜欢那个版本。谢谢 :) – Ms01 2012-02-29 21:56:22