我試圖從我們的考勤數據庫(SQL Server 2008)中爲上一段時間拖延的學生提供幫助。考勤期存儲在ATT.A1, ATT.A2 ... ATT.A7
。我想安排一份工作,從早上9點開始每個小時運行一次,然後拖延遲到的學生,但我無法弄清代碼。SQL - 在SELECT語句和WHERE子句中使用變量作爲列
這裏是我的代碼(僞代碼):
Declare @Period varchar(6)
Set @Period = 'att.a' + Cast((DATENAME(hour, GETDATE()) - 8) as varchar(1))
Select SC, SN, DT, @Period as Period, ATT.A1
From ATT
Where SC = '9' and @Period = 'T'
and DT = DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)
當我用這個,我沒有得到任何結果。如果我從Where子句中刪除@Period = 'T'
,我得到如下:
9 5177 2012-08-24 00:00:00.000 att.a1 T
9 5211 2012-08-24 00:00:00.000 att.a1
9 5225 2012-08-24 00:00:00.000 att.a1 T
9 5229 2012-08-24 00:00:00.000 att.a1 T
9 5235 2012-08-24 00:00:00.000 att.a1 V
9 5242 2012-08-24 00:00:00.000 att.a1 T
9 5268 2012-08-24 00:00:00.000 att.a1
我知道,當我在使用@Period
的SELECT
聲明和WHERE
條款它使用的@Period
的字符串值,但我需要它使用@Period
的值爲Table.Column
。
因此,在9:00它將從ATT.A1
,從上午10點選擇ATT.A2
... 15:00從ATT.A7
每一次比較是否ATT.A#= 'T'
我希望是十分明顯的。
感謝, 安東尼
使用'GETDATE()'在查詢中被追逐的目標,影響性能,並且可能產生好奇的結果,例如隨着日期的變化。在變量中捕獲當前日期/時間幾乎總是一個更好的主意,然後根據需要使用該值。在存儲過程中,這在多個語句中更重要。多次使用'GetDate()'的最常見原因是捕獲長時間運行操作的開始和結束時間。 – HABO
您能否提供樣本輸入,即「ATT」數據和期望的結果? – HABO
@HABO謝謝。邁克爾在下面提供的案例陳述的作品,但我改變它適用於你在這裏談論的,即我'設置@日期= DATEADD(日,DATEDIFF(天,0,GETDATE()),0)',然後使用'並在實際查詢的Where子句中使用DT = @ Date',這樣它只會'GETDATE()'一次。 –