2016-09-08 29 views
6

我知道我在某處讀取使用函數作爲連接(例如year(date))在具有年份的另一個表上進行連接不是加入的最佳方式。加入使用日期字段的最佳方式

我基本上有一個年表字段與值2016和另一個表與實際日期如01/01/2016我使用年(日期)進行加入。

在2016年創建一個字段是否是一種好的做法,例如通常在一個財務期開始,以便在開始日期爲01/04/2016和結束日期爲31/03/2016時使用這些字段並使用這些字段做一個加入。但想知道如何看待加入?還是繼續使用我使用year()函數將01/01/2016轉換爲一年的方法?

+2

好問題。一些示例數據會使它更好:) – kbball

+1

你的問題不清楚。您是否嘗試加入同一日曆年或從四月開始到三月結束的財政年度的記錄。如果後面的部分是正確的,你上面描述的加入如何幫助加入最後一個季度的價值。 PI澄清你的問題,顯示你正在使用的查詢,並提供樣本數據... – anil

回答

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可能不會使用它。

3

不,不要做任何特別的事情。通過逆轉問題可以輕鬆解決問題。

與目前執行的問題是,一個函數必須在連接表的每一行中主表的每一行,其中有2種討厭的效果來執行:

  • 它的速度慢。您必須在連接表

的datetime列執行函數的n×m倍

  • 你不能使用索引(如果有一個,並且應當有),但有一個簡單的方法,以避免一切那種糟糕:將年份的開始和結束計算爲年份值的日期時間,並將其用於在其日期時間內的這兩個值之間加入其他表格。這將:

    • 只計算開始/結束日期每一次主錶行
    • 允許對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> 
    
  • +0

    這就是我所希望的,謝謝你,會測試出來 – abs786123

    -1


    而不是採取廣告的風險定一個新的列,使用子字符串函數。從兩張表中取所需的列。在連接條件中指定條件爲column_Table1 = substring(column_Table2,6,10),如果日期格式爲dd/mm/yyyy

    +0

    這會對性能有好處嗎? – abs786123

    相關問題