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

表日期列与生成日期列表的比较-MYSQL,mysql,date,comparison,Mysql,Date,Comparison,当比较表列中的日期和MYSQL中列表中生成的日期时,似乎有一种奇怪的行为 请看一下参考资料 工资表: 日期列表是在两个特定日期之间以固定的日期间隔生成的 查询: 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-0

当比较表列中的日期和MYSQL中列表中生成的日期时,似乎有一种奇怪的行为

请看一下参考资料

工资表:

日期列表是在两个特定日期之间以固定的日期间隔生成的

查询:

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
正如您所看到的,生成日期列表与上面的工资表相匹配。然而,当比较完成时,它会返回零个记录

比较查询:

因此,我有以下问题:

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

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

整个失败的原因是什么

如何在没有任何程序/功能的情况下在Select自身中修复它

附言:

我还试图在SQLServer和Oracle中测试这一点

有许多很好的问题和答案可以支持“日期比较”问题,这些问题在网站的各种场景中都会出现。这包括一些职位,如。等可能有一个隐藏在某处的问题,我正面临着不同的措辞。找不到问题,因此发布了问题。

第二次更新:

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

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,但在您的SQLFIDLE中没有

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
更新结束

你这样试过吗

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函数会失败,因为你是varcharis?日期不是ISO格式。因此,您必须使用STR_to_DATE函数


要了解STR_TO_DATE的确切用法,请阅读和。我对微秒部分不太确定。

@bonCodigo如果您能提供一些反馈,这对您和我都有帮助。感谢您的回答,并花时间对此进行研究。我已经尝试了几乎每一个可能的相关日期函数,我可以用它来获得日期。包括你的,到目前为止什么都没起作用。我将用我碰巧注意到的一些发现更新这个问题。例如,如果您执行一个简单的“从上述日期列表中选择*”查询,它仍然不会返回任何内容。很高兴听到你有其他的魔法。@bonCodigo更新了我的答案。谢谢你为这个伙伴工作。你能给我你的MYSQL SQLFiddle链接来更新你的答案吗?干杯。@bonCodigo我刚刚用了你的,并将我的查询粘贴到其中:
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
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') 
)
;