【问题标题】:Start Date and End Date Query not working开始日期和结束日期查询不起作用
【发布时间】:2013-11-29 06:38:39
【问题描述】:

以下是需求

如果搜索日期范围是 2013 年 5 月 15 日到 2013 年 5 月 21 日,则将包含或排除具有以下事件日期范围的事件:

1/01/2013 to 6/30/2013 include
2/15/2013 to 3/15/2013 exclude
5/01/2013 to 5/19/2013 include
5/01/2013 to 5/14/2013 exclude
5/15/2013 to 5/15/2013 include
5/21/2013 to 5/21/2013 include
5/17/2013 to 5/30/2013 include
5/16/2013 to 5/20/2013 include
5/22/2013 to 5/30/2013 exclude
*5/16/2013 to 00/00/0000 include
5/22/2013 to 00/00/0000 exclude*

以下是我提出的查询,但不符合上述条件

SELECT cm_id,cm_date_from,cm_date_to FROM Cat_Master
WHERE TRUE  AND ( "2013-05-15" BETWEEN cm_date_from AND cm_date_to OR "2013-05-21" BETWEEN cm_date_from AND cm_date_to
    OR "2013-05-15" >= cm_date_from AND "2013-05-21" <= cm_date_to   OR "2013-05-15" <= cm_date_from AND "2013-05-21" >= cm_date_to
    )

请指导以上查询 谢谢

【问题讨论】:

  • 这个问题简单的和mysql或者sql有关。为什么java,.net和php?
  • “它不符合上述条件”你能指出根据你的查询出错的条件吗?

标签: java php mysql .net sql


【解决方案1】:

TO_DATE(string1, [format_mask], [nls_language])

TO_DATE('2013-05-15, 'yyyy-mm-dd').

对于日期比较,请使用日期变量。

P.S:我假设你使用的是 Oracle Db(因为你没有提到)

【讨论】:

  • 我们正在使用 MYSQL DB
【解决方案2】:

您似乎在第二个和第三个 OR 运算符之后错过了大括号。
试试这个:

SELECT cm_id,cm_date_from,cm_date_to
FROM Cat_Master
WHERE TRUE  AND ( 
  "2013-05-15" BETWEEN cm_date_from AND cm_date_to
  OR
  "2013-05-21" BETWEEN cm_date_from AND cm_date_to
  OR
  ( "2013-05-15" >= cm_date_from AND "2013-05-21" <= cm_date_to )
  OR
  ( "2013-05-15" <= cm_date_from AND "2013-05-21" >= cm_date_to )
    )

【讨论】:

  • 您好,此查询返回相同的结果。我想要可以处理 5/16/2013 to 00/00/0000 include 5/22/2013 to 00/00/0000 exclude 的结果,这是因为在我的数据库中一些 cm_date_from 是 00/00 /0000 默认
【解决方案3】:

使用日期类型来比较日期。

  WHERE ( to_date('2013-05-15','YYYY-MM-DD') BETWEEN cm_date_from AND cm_date_to OR 
  to_date('2013-05-21','YYYY-MM-DD') BETWEEN cm_date_from AND cm_date_to
  OR to_date('2013-05-15','YYYY-MM-DD') >= cm_date_from AND to_date('2013-05-21','YYYY-MM-DD') <= 
  cm_date_to   OR to_date('2013-05-15','YYYY-MM-DD') <= cm_date_from AND 
to_date('2013-05-21','YYYY-MM-DD') >= cm_date_to  );

【讨论】: