我有一个复选框,选中后,我的日期范围翻转,让我现在可以选择要查看的日期范围。
所以,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 )
任何帮助我将不胜感激。
汤姆
答案 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
的另一个原因是日期必须按特定顺序排列,否则不返回任何内容,旧日期必须是第一个,较年轻日期必须是最后日期。你不能只在语法之间反转它们。