表日期列与生成的日期列表比较 - MYSQL

时间:2012-12-08 13:07:17

标签: mysql date comparison

将表格列中的日期与MYSQL中列表中生成的日期进行比较时似乎有一种奇怪的行为。

请查看* SQLFIDDLE参考。

薪资表

ID  DATESTAMP
1   August, 30 2012 00:00:00+0000
2   September, 02 2012 00:00:00+0000
3   September, 15 2012 00:00:00+0000
4   September, 24 2012 00:00:00+0000
5   October, 05 2012 00:00:00+0000
6   October, 16 2012 00:00:00+0000
7   October, 19 2012 00:00:00+0000
8   November, 02 2012 00:00:00+0000
9   November, 10 2012 00:00:00+0000
10  November, 16 2012 00:00:00+0000
11  November, 24 2012 00:00:00+0000
12  November, 30 2012 00:00:00+0000
13  December, 01 2012 00:00:00+0000
14  December, 07 2012 00:00:00+0000

日期列表是在两个特定日期之间生成的,具有恒定的日间隔

查询:

set @i:= 0;

SELECT date_format(DATE(ADDDATE('2012-10-05', 
INTERVAL @i:=@i+14 DAY)),'%Y-%m-%d')
AS dateP, @i
FROM payroll
HAVING @i < datediff(now(), date '2012-10-05')
;

DATEP          @IntervalDays
2012-10-19     14
2012-11-02     28
2012-11-16     42
2012-11-30     56
2012-12-14     70

如您所见,生成的日期列表与上面的Payroll表匹配。但是,当比较完成后,它会重新记录零记录。

比较查询

set @i:= 0;

SELECT distinct datestamp FROM payroll
WHERE date(datestamp) in (
SELECT DATE(ADDDATE('2012-10-05', 
INTERVAL @i:=@i+14 DAY) ) AS dateP
FROM payroll
where @i < DATEDIFF(now(), date '2012-10-05') 
)
;

所以我有的问题

  • 内部查询在用作嵌套查询时是否停止生成日期?

  • 我在这里使用的日期比较方法有什么问题吗?

  • 这可能是整个失败的原因吗?

  • 如何在没有任何程序/功能的情况下在Select内修复它? :)

PS:

我也试图在SQL服务器和Oracle中测试它。

在网站的各种情况下,支持“日期比较”问题有很多好的问题和答案。其中包括mysql date comparison with date_format等帖子。等等。可能有一个隐藏在某个地方,要求我面对不同措辞的确切问题。无法找到并因此发布了这个问题。

1 个答案:

答案 0 :(得分:1)

第二次更新:

现在我在每个版本都使用它:

select
*
from
Payroll
inner join 
(
SELECT DATE(DATE_ADD('2012-10-05', 
INTERVAL @i:=@i+14 DAY) ) AS dateP
FROM Payroll, (SELECT @i:=0) r
where @i < DATEDIFF(now(), date '2012-10-05') 
) sq on Payroll.datestamp = sq.dateP

您只需要在查询中初始化变量。

<强>更新

奇怪的是,这个可以在我的本地机器上运行而没有问题(版本5.1.41-3ubuntu12.7-log),但不在你的SQLfiddle中。

set @i:= 0;
select
*
from
Payroll
inner join 
(
SELECT DATE(DATE_ADD('2012-10-05', 
INTERVAL @i:=@i+14 DAY) ) AS dateP
FROM Payroll
where @i < DATEDIFF(now(), date '2012-10-05') 
) sq on Payroll.datestamp = sq.dateP

END OF UPDATE

你试过这样的吗?

set @i:= 0;

SELECT distinct datestamp FROM payroll
WHERE STR_TO_DATE(datestamp, '%M, %d %Y %H:%i:%f') in (
SELECT DATE(ADDDATE('2012-10-05', 
INTERVAL @i:=@i+14 DAY) ) AS dateP
FROM payroll
where @i < DATEDIFF(now(), date '2012-10-05') 
)
;

我的猜测是,DATE()函数失败,因为你是varchar(是吗?)日期不是ISO格式。因此,您必须使用STR_TO_DATE()函数。

准确使用STR_TO_DATE()阅读herehere。我不确定微秒部分。