好的,所以我无法弄清楚为什么会这样。我正在使用以下查询来生成日期列表。从本质上讲,它使用连接和联合来创建一个包含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更低的开销。只是不确定如何正确过滤。
答案 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) ;