MySQL "Left Outer Join" 问题
MySQL "Left Outer Join" Issue
"Left Outer Join"
中的大问题
"mydata" table 架构
pk1 作为 varchar ,pk2 作为 varchar,pk3 作为数据时间,value1 作为 int,value2 作为 int
左外连接 SQL
select a.pk1,a.pk3,a.value1,a.value2,b.value1,b.value2
from mydata as a
left outer join mydata as b
on (a.pk1=b.pk1 and b.pk2='data2' and a.pk3=b.pk3)
where a.pk1='abc' and a.pk2='data1' and a.pk3>='2016/5/3 15:00' and
a.pk3 <= '2016/5/3 16:00'
pk3 使用 >= & <= 没问题,select 结果
abc ,2016/5/3 15:00 , 1,1,2,2
abc ,2016/5/3 15:30 , 2,2,9,9
abc ,2016/5/3 16:00 , 3,3,12,12
但是当我使用 a.pk3='2016/5/3 15:00' 时,select 结果
abc ,2016/5/3 15:00 , 1,1,null,null
我在 MS SQL 试了一下,select 结果
abc ,2016/5/3 15:00 , 1,1,2,2
有什么不同???我应该如何修复 MySQL sql stirng 因为我需要 MS SQL 做的结果??
======================
CREATE TABLE `mydata` (
`pk1` char(20) NOT NULL,
`pk2` char(10) NOT NULL,
`pk3` datetime NOT NULL,
`value1` int NOT NULL,
`value2` int NOT NULL,
PRIMARY KEY (`pk1`,`pk2`,`pk3`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
顺便说一句,如果我使用 a.pk3>='2016/5/3 15:00' 和 a.pk3 <= '2016/5/3 15:00' ,并且select 结果
abc ,2016/5/3 15:00 , 1,1,2,2
========================
select a.pk1,a.pk3,a.value1,a.value2,b.value1,b.value2
from mydata as a
left outer join mydata as b
on (a.pk1=b.pk1 and b.pk2='data2' and a.pk3=b.pk3)
where a.pk1='abc' and a.pk2='data1' and a.pk3>='2016/5/3 15:00'
abc ,2016/5/3 15:00 , 1,1,2,2
abc ,2016/5/3 15:30 , 2,2,9,9
abc ,2016/5/3 16:00 , 3,3,12,12
....
....
=========================
是的,将 sql 字符串修复为 a.pk3=convert('2016/5/1 09:30', datetime) 将解决此问题。
查询看起来很简单。我猜 mydata
table 在 MySQL.
中没有 pk3='2016/5/3 15:00'
的记录
您可以使用查询进行测试
select * from mydata where pk3='2016/5/3 15:00'
在 MySQL
如果上面的查询returns除了你能看到一条pk3='2016/5/3 15:00'
的记录外,可能是格式化的情况,在这种情况下你需要转换为datetime
select * from mydata where pk3=convert('2016/5/3 15:00', datetime)
由于您没有提供更多代码和插入的数据,我们只能猜测:
您 table 中的时间戳可能会晚几秒或几毫秒。它会匹配子句 a.pk3 >= '2016/5/3 15:00' AND a.pk3 <= '2016/5/3 16:00'
但不等于第一个值。在您的显示格式中,秒和毫秒被截断,但比较取决于内容,而不是显示的内容。
"Left Outer Join"
中的大问题"mydata" table 架构 pk1 作为 varchar ,pk2 作为 varchar,pk3 作为数据时间,value1 作为 int,value2 作为 int
左外连接 SQL
select a.pk1,a.pk3,a.value1,a.value2,b.value1,b.value2
from mydata as a
left outer join mydata as b
on (a.pk1=b.pk1 and b.pk2='data2' and a.pk3=b.pk3)
where a.pk1='abc' and a.pk2='data1' and a.pk3>='2016/5/3 15:00' and
a.pk3 <= '2016/5/3 16:00'
pk3 使用 >= & <= 没问题,select 结果
abc ,2016/5/3 15:00 , 1,1,2,2
abc ,2016/5/3 15:30 , 2,2,9,9
abc ,2016/5/3 16:00 , 3,3,12,12
但是当我使用 a.pk3='2016/5/3 15:00' 时,select 结果
abc ,2016/5/3 15:00 , 1,1,null,null
我在 MS SQL 试了一下,select 结果
abc ,2016/5/3 15:00 , 1,1,2,2
有什么不同???我应该如何修复 MySQL sql stirng 因为我需要 MS SQL 做的结果??
======================
CREATE TABLE `mydata` (
`pk1` char(20) NOT NULL,
`pk2` char(10) NOT NULL,
`pk3` datetime NOT NULL,
`value1` int NOT NULL,
`value2` int NOT NULL,
PRIMARY KEY (`pk1`,`pk2`,`pk3`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
顺便说一句,如果我使用 a.pk3>='2016/5/3 15:00' 和 a.pk3 <= '2016/5/3 15:00' ,并且select 结果
abc ,2016/5/3 15:00 , 1,1,2,2
========================
select a.pk1,a.pk3,a.value1,a.value2,b.value1,b.value2
from mydata as a
left outer join mydata as b
on (a.pk1=b.pk1 and b.pk2='data2' and a.pk3=b.pk3)
where a.pk1='abc' and a.pk2='data1' and a.pk3>='2016/5/3 15:00'
abc ,2016/5/3 15:00 , 1,1,2,2
abc ,2016/5/3 15:30 , 2,2,9,9
abc ,2016/5/3 16:00 , 3,3,12,12
....
....
=========================
是的,将 sql 字符串修复为 a.pk3=convert('2016/5/1 09:30', datetime) 将解决此问题。
查询看起来很简单。我猜 mydata
table 在 MySQL.
pk3='2016/5/3 15:00'
的记录
您可以使用查询进行测试
select * from mydata where pk3='2016/5/3 15:00'
在 MySQL
如果上面的查询returns除了你能看到一条pk3='2016/5/3 15:00'
的记录外,可能是格式化的情况,在这种情况下你需要转换为datetime
select * from mydata where pk3=convert('2016/5/3 15:00', datetime)
由于您没有提供更多代码和插入的数据,我们只能猜测:
您 table 中的时间戳可能会晚几秒或几毫秒。它会匹配子句 a.pk3 >= '2016/5/3 15:00' AND a.pk3 <= '2016/5/3 16:00'
但不等于第一个值。在您的显示格式中,秒和毫秒被截断,但比较取决于内容,而不是显示的内容。