加入使用日期字段的最佳方式

时间:2016-09-08 15:33:11

标签: sql sql-server

我知道我在某个地方读过使用函数作为连接例如年(日期)在另一个具有年份的表上进行连接并不是最好的连接方式。

我基本上有一个表格,其中年份字段的值为2016,另一个表格的实际日期为01/01/2016,我使用年份(日期)进行加入。

在2016年创建一个字段是不错的做法,例如通常会在财务期开始,因此要有一个字段为开始日期01/04/2016和结束日期31/03/2016并使用这些字段来加入。但是想知道在加入方面会是什么样子?或者我是否应该继续使用我的方法将01/01/2016转换为使用year()函数的年份?

3 个答案:

答案 0 :(得分:3)

不,不要做任何特别的事。通过扭转问题可以轻松解决您的问题。

当前实现的问题是必须在主表中的每一行的连接表的每一行上执行一个函数,这有两个令人讨厌的效果:

  • 它很慢。您必须执行n x m次函数
  • 你不能在联接表的datetime列上使用索引(如果有的话,应该有)

但是有一种简单的方法可以避免所有这些肮脏:将年份的起点和终点计算为年份值的日期时间,并使用它来加入其日期时间在这两个值之间的另一个表。这会:

  • 仅计算每个主表行的开始/结束日期
  • 允许在datetime列上使用索引(如果没有,则应添加一个)

我真的不明白你使用真实代码的问题,所以这就是伪查询的样子:

select *
from table1
join table2 on table2.datetime
  between <calculate start of year from table1.year>
  and <calculate end of year from table1.year>

答案 1 :(得分:1)

您可以做的一件事是定义一个计算列,然后在其上创建一个索引:

alter table t add start_year as (year(start_date));

create index idx_t_??_start_year on t(??, start_year);

??旨在成为一个或多个其他列。仅start_year上的索引不会非常有选择性,因此SQL Server可能不会使用它。

答案 2 :(得分:-1)

您希望使用子字符串函数,而不是冒险添加新列。从两个表中获取必需的列。在连接条件中,如果日期格式为dd / mm / yyyy,则将条件指定为column_Table1 = substring(column_Table2,6,10)