Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在T-SQL中右键联接日期表?_Sql_Sql Server_Tsql_Join - Fatal编程技术网

如何在T-SQL中右键联接日期表?

如何在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

我过去做得很好,没有任何问题。但是,由于某些原因,我现在无法成功地加入日期字段上的日期表。总之,我有两张桌子。第一个表有一个日期列和几个非日期列。然后我有一个日期表,它只有两个日期列

我通过插入连续13个月的月初日期来初始化这个日期表。但我的另一张表只有9个月的数据

所以表A看起来像:

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条款。