如何在T-SQL中加入日期表?

时间:2011-05-14 03:46:33

标签: sql sql-server tsql join

我过去做过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个月没有记录。

3 个答案:

答案 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))

希望这有帮助。