2012-12-08 96 views
2

将表列中的日期与MYSQL中的列表中生成的日期进行比较时,似乎存在一种奇怪的行为。使用生成的日期列表比较列日期列 - 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:[email protected]+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 

正如你可以看到生成的日期列表与上面的工资表格匹配。但是,当比较完成时,它会重新记录零个记录。

比较查询

set @i:= 0; 

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

所以问题我有

  • 是内部查询停止为嵌套查询中使用时产生的日期?

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

  • 这可能是整个故障的原因?

  • 如何在Select本身没有任何程序/功能修复它? :)

PS:

我也试图在SQL服务器来测试这个问题,以及甲骨文。

有很多很好的问题和答案来支持在与网站的各种情况下发生的“日期比较”问题。这包括mysql date comparison with date_format等帖子。等等。可能会有一个隐藏的地方要求我正在用不同的措辞来处理确切的问题。无法找到并发布问题。

回答

1

第二次更新:

现在我得到了它在每一个版本的工作:

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

你只需要初始化查询里面的变量。

UPDATE:

奇怪的是,这一次我的本地机器上工作没有问题(版本5.1.41-3ubuntu12.7日志),但不是在你的SQLfiddle。UPDATE OF

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

END

你有没有尝试过这样的吗?

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:[email protected]+14 DAY)) AS dateP 
FROM payroll 
where @i < DATEDIFF(now(), date '2012-10-05') 
) 
; 

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

关于STR_TO_DATE()的确切用法请参阅herehere。我不确定微秒的部分。

+0

@bonCodigo如果您提供一些反馈,它可以帮助您和我。 – fancyPants

+0

感谢您的回答,并花时间研究此问题。我已经尝试了几乎每种可能的相关日期函数,我可以使用它们来获取日期。包括你的,到目前为止没有任何工作。我会在发现我偶然注意到的情况下更新这个问题。例如。如果你在日期列表查询上面做了一个简单的'SELECT * FROM',它依然不会返回任何东西。很高兴听到你是否有其他魔法。 – bonCodigo

+0

@bonCodigo更新了我的答案。 – fancyPants