如何在SQL Server 2012中搜索两列以上的日期

时间:2014-02-20 07:07:28

标签: sql sql-server sql-server-2012

假设我有一张这样的表:

Event (eventID, StartDateTime, EndDateTime)
  • StartDateTimedatetime数据类型
  • EndDateTimedatetime数据类型

现在样本数据可能是这样的:

EventID   StartDateTime             EndDateTime
-----------------------------------------------------------
   1      2014-02-21 00:00:00.000   2014-02-23 23:59:59.000
   2      2014-02-22 00:00:00.000   2014-02-24 23:59:59.000

我想在2014-02-23 00:00:00.000

搜索正在发生的事件
SELECT
*
FROM
    Event
WHERE
    (StartDateTime <= '2/23/2013 00:00:00 AM')
    OR (EndDateTime >= '2/23/2013 00:00:00 AM')

我已经尝试了上面的代码,但它没有返回正确的结果。

我错过了什么吗?你能告诉我我错过了什么吗?

4 个答案:

答案 0 :(得分:2)

您不希望OR,您需要AND。您希望在指定日期之前或之后开始的事件,在指定日期之后结束:

SELECT
*
FROM
    Event
WHERE
    StartDateTime <= '20130223'
    AND
    EndDateTime > '20130223'

另外,如果时间部分很重要,我会认真建议您将这些日期范围作为半开放时间间隔存储,并使用独占结束日期。计算独占端点要容易得多,读得更干净:

INSERT INTO Event(EventID,StartDateTime,EndDateTime) values
(1,'2014-02-21T00:00:00.000','2014-02-24T00:00:00.000'),
(2,'2014-02-22T00:00:00.000','2014-02-25T00:00:00.000')

它的优势在于它不是(任意)排除当天的最后一分钟,就像你当前的范围一样。

答案 1 :(得分:1)

你试过BETWEEN吗?

DECLARE @EventTime DATETIME
SET @EventTime = '20140223 00:00:00'

SELECT * 
FROM EVENT
WHERE @EventTime BETWEEN StartDateTime AND EndDateTime

答案 2 :(得分:1)

使用此查询

SELECT * FROM Event
     WHERE '2014-02-23 00:00:00.000' BETWEEN StartDateTime and EndDateTime

答案 3 :(得分:0)

在WHERE子句中使用Between运算符。它指定了要测试的范围。

  • 注意 BETWEEN 运算符包含边界情况。

    如果test_expression的值大于或等于begin_expression的值且小于或等于end_expression的值,则

    BETWEEN 返回TRUE。