"左外连接"中的大问题
" MYDATA"表模式 pk1为varchar,pk2为varchar,pk3为datatime,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使用&gt; =&amp;&#; &lt; =,选择结果
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 =&#39; 2016/5/3 15:00&#39;时,选择结果
abc ,2016/5/3 15:00 , 1,1,null,null
我在MS SQL上尝试,选择结果
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&gt; =&#39; 2016/5/3 15:00&#39;和a.pk3&lt; =&#39; 2016/5/3 15:00&#39; ,以及选择结果
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(&#39; 2016/5/1 09:30&#39;,datetime)将解决此问题。
答案 0 :(得分:1)
由于您没有提供更多代码和插入的数据,我们只能猜测:
表中的时间戳可能是几秒或几毫秒。它匹配条款a.pk3 >= '2016/5/3 15:00' AND a.pk3 <= '2016/5/3 16:00'
但不等于第一个值。在您的显示格式中,秒和毫秒只是被切断,但比较取决于内容,而不是显示的内容。
答案 1 :(得分:0)
查询看起来很简单。我猜mydata
表没有MySQL中pk3='2016/5/3 15:00'
的记录。
您可以使用查询来测试此信息
select * from mydata where pk3='2016/5/3 15:00'
在 MySQL
如果上面的查询只返回任何内容,但您可以看到pk3='2016/5/3 15:00'
的记录,则可能是格式化的情况,在这种情况下您需要转换为日期时间
select * from mydata where pk3=convert('2016/5/3 15:00', datetime)