如何在T-SQL中右键联接日期表?
我过去做得很好,没有任何问题。但是,由于某些原因,我现在无法成功地加入日期字段上的日期表。总之,我有两张桌子。第一个表有一个日期列和几个非日期列。然后我有一个日期表,它只有两个日期列 我通过插入连续13个月的月初日期来初始化这个日期表。但我的另一张表只有9个月的数据 所以表A看起来像:如何在T-SQL中右键联接日期表?,sql,sql-server,tsql,join,Sql,Sql Server,Tsql,Join,我过去做得很好,没有任何问题。但是,由于某些原因,我现在无法成功地加入日期字段上的日期表。总之,我有两张桌子。第一个表有一个日期列和几个非日期列。然后我有一个日期表,它只有两个日期列 我通过插入连续13个月的月初日期来初始化这个日期表。但我的另一张表只有9个月的数据 所以表A看起来像: col_A col_B col_C ----- ------ ------- sfds jkjlj 7-1-2009 rewr sfsfsd 5-1-200
col_A col_B col_C
----- ------ -------
sfds jkjlj 7-1-2009
rewr sfsfsd 5-1-2009
xcxvg sdfsfk 4-1-2009
...
StartDate EndDate
--------- ---------
7-1-2009 7-31-2009
6-1-2009 6-30-2009
5-1-2009 5-31-2009
...
但是表B看起来像:
col_A col_B col_C
----- ------ -------
sfds jkjlj 7-1-2009
rewr sfsfsd 5-1-2009
xcxvg sdfsfk 4-1-2009
...
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个月的数据,因为表B有13个月/记录。然而,我总共只有9个月的时间。有人知道为什么会这样吗?还有其他我可能尝试达到同样结果的事情
我的主要目标是在过去的13个月中,让表_A每个月都包含一次,即使有空值。但现在,它只包括9个月,因为其他4个月没有记录。如果日期中有时间部分(通常有!),则加入日期列可能会有问题 使用
DATEPART()
或CONVERT()
(或其他日期函数)仅提取日期部分更安全,但这可能会排除使用索引
一种方法是使用:
DATEADD(day, DATEDIFF(day, 0, DateColumn), 0)
i、 e
还有以下表格:
CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
但我更喜欢前者。我只是尝试了一下,结果所有月份,列colu_A、colu_B和colu_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
我通常在日期连接时首先将它们转换为整数,因为在日期连接(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))
然而,似乎你真的很想加入这个年度和月份,因为表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))
希望这有帮助。TSQL for Sybase或SQL Server?版本将有助于您确保完整版本没有where子句?请您提供两个表中的所有数据和实际查询,好吗?如果B中有13行,你会得到13行,除非你用a、WHERE或其他东西过滤掉它们。我想有些东西是混淆的。如果您确实从表B中选择了*,您真的得到了13行吗?谢谢,您刚刚提醒了我。表A中的日期列实际上是一个强制日期,它将日期强制转换为该月的第一天,但它仍然是一个日期数据类型。谢谢你的提示。我现在不在我的工作电脑前,但我明天会试试这个让你知道。即使他们不匹配,他也应该有记录,因为这是一个外部连接。谢谢米奇,但我实际上需要表A中的每月第一天。你的代码正好给了我这一天。这个月的第一天我该怎么做?谢谢,我修改了我的描述。你能看看吗?仍然<13个月。谢谢我修改了我的描述。你能看看吗?仍然<13个月。我删除了第二次插入中的where条款。