SQL:仅比较年份的日期比较

时间:2015-09-17 20:24:42

标签: mysql sql

好的,所以我无法弄清楚为什么会这样。我正在使用以下查询来生成日期列表。从本质上讲,它使用连接和联合来创建一个包含100,000个日期的列表(有点矫枉过正,我知道,但这是后来的另一件事。)

最后,我尝试使用WHERE子句来过滤列表。因此,不是全部10,000,而是仅返回符合条件的日期。这是为我的程序生成特定日期列表的超快速方法。

我的问题是我的where子句无法进行正确的比较。它返回end_date中< = YEAR的所有日期,当我希望它返回end_date中< =整个日期的所有日期时。

tmp1[size1 + 1] = numeric_limits<T>::max();

我无法弄清楚为什么会这样。其他一切都很完美,表生成,甚至其他类型的比较(例如:dayofweek(this_date)= 1成功返回所有星期日)。但是当我包含那个特殊的where子句时,它会返回所有低于2016-12-31的日期,它应该在2016-1-17截止。

任何帮助都将不胜感激。

编辑:

所以回复解决了我的问题,谢谢。这只是一个临时表示,我最终会让它成为一个接受日期参数的函数,而不是在开始时设置变量,一旦我得到它。

我的最后一个问题是重复。最终目标是将巨型列表过滤到重复事件的特定日期。因此,例如,事件是每个星期四的一段时间,我会使用where子句缩小到那个。

我已经让它像每周一样重复工作。

set @start_date = '2015-9-20';
set @end_date = '2016-1-17';

select * from
(select  @start_date + interval ((a.a) + (10 * b.a) + (100 * c.a) + (1000 * d.a) + (10000 * e.a)) day this_date
from 
(select 0 as a
union all select 1
union all select 2
union all select 3
union all select 4
union all select 5
union all select 6
union all select 7
union all select 8
union all select 9) as a 
join
(select 0 as a
union all select 1
union all select 2
union all select 3
union all select 4
union all select 5
union all select 6
union all select 7
union all select 8
union all select 9) as b 
join
(select 0 as a
union all select 1
union all select 2
union all select 3
union all select 4
union all select 5
union all select 6
union all select 7
union all select 8
union all select 9) as c
join
(select 0 as a
union all select 1
union all select 2
union all select 3
union all select 4
union all select 5
union all select 6
union all select 7
union all select 8
union all select 9) as d
join
(select 0 as a
union all select 1
union all select 2
union all select 3
union all select 4
union all select 5
union all select 6
union all select 7
union all select 8
union all select 9) as e) v
where this_date <= @end_date;

但我无法弄清楚的是如何每两周或每月做一次,这是我最终想要的。

我想这样做,这个公式比使用循环和dateadd更低的开销。只是不确定如何正确过滤。

1 个答案:

答案 0 :(得分:1)

在第一行中,您将字符串转换为日期this_date

 @start_date + interval ....

但是在你的where中,由于将文字与日期进行比较,因此存在问题。
现在你有:

where this_date <=  '2016-1-17'

你需要像

这样的东西
where this_date <= STR_TO_DATE(@end_date, '%Y-%m-%d')

where this_date <=  DATE_ADD('2016-1-17',INTERVAL 0 DAY) ;
where this_date <=  DATE_ADD(@end_date ,INTERVAL 0 DAY) ;