表日期列与生成日期列表的比较-MYSQL
当比较表列中的日期和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
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')
)
;