选择两个不同的日期范围

时间:2014-08-05 11:26:17

标签: sql

我有一个复选框,选中后,我的日期范围翻转,让我现在可以选择要查看的日期范围。

所以,2014年4月15日至2014年4月20日...当我的复选框被选中时,这个日期范围现在是4/10/14到4/15/14。

在我的SQL Select中,我需要根据此复选框选择哪个日期范围。

这不起作用??

Where ( ? Between Date_1 and Date_2 ) or ( ? Between Date_2 and Date_1 )

这也不起作用吗?

Where ( ?
Case
When Ck_Bx Is Null
Then Date_2 and Date_1
Else Date_1 and Date_2
End
)

这是正在运行的SQL,我正在尝试修改“在哪里”,

ExecuteSQL ( " 

Select ToDo_Name_Calc, ToDo_Name

From ToDo  

WHERE ( ( ? Between ToDo_Alert_Date and ToDo_Date ) or ( ? Between ToDo_Date and ToDo_Alert_Date ) ) and ToDo_Ck_Bx Is Null

Order By ToDo_Alert_Date Asc " ; " - " ; "" ;

cDateOfFirstPortal +11  )

任何帮助我将不胜感激。

汤姆

1 个答案:

答案 0 :(得分:0)

between实际上只是一个语法快捷方式,它完全等同于:  (field> =小值和field< =更大值)

我们假设我们使用2014-04-20作为较大的值,但field包含时间和日期。因此,根据2014-04-20 11:12:13的存储值评估< = 2014-04-20意味着忽略该值。事实上,我们真的希望包含这个价值(它发生在2014-04-20的那一天),最可靠的保护方式我们不会犯这个错误就是获得的所有数据都低于2014-04 -21

因此,在使用之间使用日期范围时遇到的最大问题是,如果出错,您可能会错过近24小时的数据。一个更安全的方法通过使用少于上限日期来避免这个问题 - 但是你添加了一天,并且因为我们需要添加一天,我们可能必须使用数据库特定代码(例如MySQL的date_add(),dateadd()对于SQL Server / Sybase)。

不使用两者之间,这是一个更安全的选项,需要一些日期算术,这里只代表+1

SELECT
      ToDo_Name_Calc
    , ToDo_Name

FROM ToDo

WHERE (
          ? >= ToDo_Alert_Date AND ? < (ToDo_Date+1) --*
          AND ToDo_Ck_Bx IS NULL)
      OR (
          ? >= ToDo_Date AND ? < (ToDo_Alert_Date+1) --*
          AND ToDo_Ck_Bx IS NOT NULL
         )

ORDER BY
      ToDo_Alert_Date ASC

- *使用dbms的相关日期添加方法。

此处不使用between的另一个原因是日期必须按特定顺序排列,否则不返回任何内容,旧日期必须是第一个,较年轻日期必须是最后日期。你不能只在语法之间反转它们。