我过去做过RIGHT JOINS没有任何问题。但是,由于某些原因,我无法在日期字段上成功加入日期表。总之,我有两张桌子。第一个表有一个日期列和几个非日期列。然后我有一个日期表,它只有两个日期列。
我通过插入连续13个月的第一个月日期初始化此日期表。但我的另一张表只有9个月的数据。
所以表A看起来像:
col_A col_B col_C
----- ------ -------
sfds jkjlj 7-1-2009
rewr sfsfsd 5-1-2009
xcxvg sdfsfk 4-1-2009
...
但表B看起来像:
StartDate EndDate
--------- ---------
7-1-2009 7-31-2009
6-1-2009 6-30-2009
5-1-2009 5-31-2009
...
但是,当我把表B连接到A时,就像这样:
SELECT *
FROM TABLE_A A
RIGHT JOIN TABLE_B B ON A.COL_C = B.StartDate
我希望得到12个月的数据,因为Table_B有13个月/记录。但是,相反,我总共只有9个月。有谁知道为什么会这样?还有其他事情我可能会尝试达到相同的结果?
我的主要目标是让Table_A包含过去13个月的每月,即使有空值。现在,它只包括9个月,因为其他4个月没有记录。
答案 0 :(得分:8)
如果日期中有时间部分(通常有!),则加入日期列可能会有问题。
使用DATEPART()
或CONVERT()
(或其他日期函数)来提取日期部分更安全,但这可能会排除使用索引。
一种方法是使用:
DATEADD(day, DATEDIFF(day, 0, DateColumn), 0)
即
SELECT *
FROM TABLE_A A
RIGHT JOIN TABLE_B B ON
DATEADD(day, DATEDIFF(day, 0, A.COL_C), 0) = DATEADD(day, DATEDIFF(day, 0, B.StartDate), 0)
还有这种形式:
CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
但我更喜欢前者。
答案 1 :(得分:2)
我只是尝试了这个并获得了所有月份,列col_A,col_B和col_C在没有匹配的情况下为空。你确定所有日期都在那里,并且没有where子句影响这个吗?
SELECT *
FROM TABLE_A A
sfds jkjlj 2009-07-01 00:00:00.000
SELECT *
FROM TABLE_B B
2009-07-01 00:00:00.000 2009-07-31 00:00:00.000
2009-06-01 00:00:00.000 2009-06-30 00:00:00.000
2009-05-01 00:00:00.000 2009-05-31 00:00:00.000
SELECT *
FROM TABLE_A A
RIGHT JOIN TABLE_B B ON A.COL_C = B.StartDate
sfds jkjlj 2009-07-01 00:00:00.000 2009-07-01 00:00:00.000 2009-07-31 00:00:00.000
NULL NULL NULL 2009-06-01 00:00:00.000 2009-06-30 00:00:00.000
NULL NULL NULL 2009-05-01 00:00:00.000 2009-05-31 00:00:00.000
答案 2 :(得分:0)
我在加入日期时通常会将它们转换为整数,因为加入日期(1)通常会产生意外结果,(2)它很慢。
我会像这样进行连接:
Select *
From
TABLE_A A
Right Join
TABLE_B B
On
((Year(A.COL_C)*10000) + (Month(A.COL_C)*100) + Day(A.COL_C)) = ((Year(B.StartDate)*10000) + (Month(B.StartDate)*100) + Day(B.StartDate))
然而,自从Table_A上的日期始终是第一个以来,您似乎真的想加入年份和月份。 我会这样做:
Select *
From
TABLE_A A
Right Join
TABLE_B B
On
((Year(A.COL_C)*100) + Month(A.COL_C)) = ((Year(B.StartDate)*100) + Month(B.StartDate))
希望这有帮助。