在两个列之间选择两个日期之间的记录

5

如何在两列之间选择两个日期范围内的记录?

Select * From MyTable Where 2009-09-25 is between ColumnDateFrom to ColumnDateTo

我有一个日期(2009-09-25),我想选择那些在时间范围列ColumnDateFrom到ColumnDateTo之间的记录。
样例:
Record 1 ColumnDateFrom = 2009-08-01 AND ColumnDateTo = 2009-10-01 Record 2 ColumnDateFrom = 2010-08-01 AND ColumnDateTo = 2010-10-01
如果我的输入日期是2009-09-28,则会得到记录1。

1
这是哪个特定的数据库引擎?你打算如何将日期传递给SQL,作为嵌入式字面量(即作为SQL的一部分)还是作为参数?你使用什么客户端框架来与数据库通信?你的问题基本上是什么?SQL语法?如何在C#或php中编写它?还是其他什么?因为从思路上讲,你是正确的,只是编写日期的语法有误(但我需要知道你使用的数据库引擎才能告诉你正确的方法)。 - Lasse V. Karlsen
7个回答

6

应该使用Between标准(T-SQL)。

SELECT * FROM MyTable WHERE @MYDATE BETWEEN ColumnDateFrom AND ColumnDateFrom

4

如果我理解正确,尝试这样做:

SELECT
    *
    FROM MyTable 
    WHERE ColumnDateFrom <= '2009-09-25' AND ColumnDateTo >= '2009-09-25'

不错,但我更喜欢... 选择*从MyTable where '2009-09-25' between ColumnDateFrom和ColumnDateTo - Rune Brattas
非常感谢您的快速回复...非常好!我现在已经完成了,可以回家了...祝大家周末愉快! - Rune Brattas
1
我从不使用BETWEEN,因为我发现使用>=、>、<=和/或<更容易阅读,因为你知道端点是否被包括在内。而使用BETWEEN时,你必须记住端点是否被包括在内。 - KM.

4

试试这个:

SELECT * FROM MyTable WHERE '2009-09-25' BETWEEN ColumnDateFrom AND ColumnDateTo

1
select * 
from MyTable 
where ColumnDateFrom <= '2009-09-25' 
    and ColumnDateTo >= '2009-09-25'

0

MySQL:

select * from MyTable where '2009-09-25' between ColumnDateFrom and ColumnDateTo

0

只需移除 "Is" 即可

Select * From MyTable 
Where '2009-09-25' Between ColumnDateFrom to ColumnDateTo

记得考虑时间部分,如果列值中包含日期和时间...(假设DateOnly()是从datetime列中剥离时间的某个函数)

Select * From MyTable 
Where '2009-09-25' Between DateOnly(ColumnDateFrom) 
                        To DateOnly(ColumnDateTo)

这个针对日期列的函数调用会阻止索引使用,不是吗? - Nathan Feger

0

这是MS Access VBA的示例:

"[LearningBegin]<= " & Format(eFilterBegin.Value, "\#mm\/dd\/yyyy\#") + " and [LearningEnd]>=" + Format(eFilterEnd.Value, "\#mm\/dd\/yyyy\#") + _
" or [LearningBegin]>= " & Format(eFilterBegin.Value, "\#mm\/dd\/yyyy\#") + " and [LearningEnd]<=" + Format(eFilterEnd.Value, "\#mm\/dd\/yyyy\#") + _
" or [LearningBegin] between " & Format(eFilterBegin.Value, "\#mm\/dd\/yyyy\#") + " and " + Format(eFilterEnd.Value, "\#mm\/dd\/yyyy\#") + " and [LearningEnd]<=" + Format(eFilterEnd.Value, "\#mm\/dd\/yyyy\#") + _
" or [LearningBegin] between " & Format(eFilterBegin.Value, "\#mm\/dd\/yyyy\#") + " and " + Format(eFilterEnd.Value, "\#mm\/dd\/yyyy\#") + " and [LearningEnd]>=" + Format(eFilterEnd.Value, "\#mm\/dd\/yyyy\#") + _
" or [LearningBegin] >= " & Format(eFilterBegin.Value, "\#mm\/dd\/yyyy\#") + " and [LearningEnd] between" & Format(eFilterBegin.Value, "\#mm\/dd\/yyyy\#") + " and " + Format(eFilterEnd.Value, "\#mm\/dd\/yyyy\#") + _
" or [LearningBegin] <= " & Format(eFilterBegin.Value, "\#mm\/dd\/yyyy\#") + " and [LearningEnd] between" & Format(eFilterBegin.Value, "\#mm\/dd\/yyyy\#") + " and " + Format(eFilterEnd.Value, "\#mm\/dd\/yyyy\#")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接