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

标签 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

如您所见,生成的日期列表与上面的工资表匹配。然而,当比较完成后,它返回零条记录。

比较查询:

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 本身内修复它而不需要任何过程/函数? :)

附言:

我也在尝试在 SQL Server 和 Oracle 中对此进行测试。

有许多很好的问题和答案来支持在网站的各种情况下发生的“日期比较”问题。这包括诸如 mysql date comparison with date_format 之类的帖子.等.. 可能有一个隐藏在某处询问我面临不同措辞的确切问题。找不到问题,因此发布了问题。

最佳答案

第二次更新:

现在我让它在每个版本中都能正常工作:

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

更新结束

你试过这样吗?

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 .我不确定微秒部分。

关于mysql - 表日期列与生成的日期列表的比较 - MYSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13777730/

相关文章:

MYSQL LOAD DATA INFILE 忽略重复行(自动增量为主键)

java - 尽管使用 rs.next() 但游标状态无效

javascript - Moment 显示相对于当前日期的生日 DAYOFYEAR

java - !(a==b) 和 a!=b 的区别

php - 从 PHP 类和 DBMS 技术创建 PDO 连接字符串

php - 更新wordpress sql中的两行

mysql - 选择不在日期之间的行(预订)

php - 使用 date_default_timezone_set 时澳大利亚 DST 时区缩写不正确

c# - C#中字符串比较方法的区别

c++ - 以有效的方式逐字节比较数据(使用 C++)