gpt4 book ai didi

sql - SQL日期间隔算法

转载 作者:行者123 更新时间:2023-12-03 19:01:36 25 4
gpt4 key购买 nike

我当前正在编写一个使用ADO在DB2数据库上运行查询的Delphi应用程序。

要求之一是用户应该能够使用日期定义查询,例如“显示最近60天的所有数据”或“显示2009年11月20日至2010年1月18日的所有数据”。除了两个事实之外,这不是问题:


日期使用日,月和年的不同字段存储在数据库中。
数据库已经在多个客户站点使用了多年,并且无法更改,因此该应用程序必须在现有数据库上运行(因此,无需更改数据库以将日期存储在一个字段中,这将使任务繁重更简单)。


我需要知道的是,是否存在一种有效的算法来构造从数据库中提取指定信息所需的SQL。例如,今天是1月18日,因此要提取从11月20日到今天的所有信息,我需要一条类似以下内容的SQL语句:

SELECT data WHERE 
((day >= 20) AND (month = 11) AND (year = 2009)) OR
((month = 12) AND (year = 2009)) OR
((day <= 18) AND (month = 1) AND (year = 2010))


显然,这是一个简单且相对简单的示例,但是如果用户希望从2008年11月而不是2009年11月检索数据,则查询范围会更大。

这是构造SQL语句的唯一方法,还是有一种更有效的方法?

最佳答案

Galghamon SQL Date Interval Algorithm提供的答案就代码而言是有效的,但无法利用索引。

我建议您在Delphi中执行所有必要的计算,以便可以在概念上将逻辑简化为以下之一:

(DateCol > @DateVal)
(DateCol >= @DateVal)
(DateCol < @DateVal)
(DateCol <= @DateVal)
(DateCol = @DateVal)


然后可以将它们扩展为您不幸的模式,如下所示(使用第1个第2个示例):

(YearCol > @YearVal OR (YearCol = @YearVal AND MonthCol > @MonthVal) OR (YearCol = @YearVal AND MonthCol = @MonthVal AND DayCol > @DayVal))
(YearCol > @YearVal OR (YearCol = @YearVal AND MonthCol > @MonthVal) OR (YearCol = @YearVal AND MonthCol = @MonthVal AND DayCol >= @DayVal))


注意:您需要精确地了解在何处使用包含式以及在何处使用专有不等式运算符。

关于sql - SQL日期间隔算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2087589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com