2016-03-01 119 views
-2

我有一個小問題與我的查詢。整個查詢實際上有點長,因爲它包含一個UNION ALLSQL Server 2012 - 選擇查詢閏年

SELECT 'ITV' = CASE WHEN tblIntake.StaffID Is Null THEN '<Unknown>' ELSE 
(tblStaffMember.StaffLast + ', ' + tblStaffMember.StaffFirst + CASE WHEN 
tblStaffMember.StaffMI Is Null THEN '' ELSE ' ' + tblStaffMember.StaffMI END) END, 
tblMember.[LAST], tblMember.[FIRST], 
'DueDate' = DATEADD(m, 6,CAST(CONVERT(Varchar(10), 
MONTH(tblIntake.EnrollDate)) + '/' + CONVERT(Varchar(10), 
DAY(tblIntake.EnrollDate)) + '/' + CONVERT(Varchar(10),YEAR(GETDATE()))As 
DateTime)), 'Type' = '6 Month Appt' 

From tblIntake LEFT JOIN tblStaffMember ON tblIntake.StaffID = 
tblStaffMember.StaffID LEFT JOIN tblMember ON 
tblIntake.KEY = tblMember.KEY 

Where tblIntake.UnEnrollDate Is Null AND 
DATEADD(m,6,CAST(CONVERT(Varchar(10),MONTH(tblIntake.EnrollDate)) + '/' + 
CONVERT(Varchar(10),DAY(tblIntake.EnrollDate)) + '/' + 
CONVERT(Varchar(10),YEAR(GETDATE()))As DateTime)) > GETDATE() AND 
DATEADD(m, 6,CAST(CONVERT(Varchar(10),MONTH(tblIntake.EnrollDate)) + '/' + 
CONVERT(Varchar(10),DAY(tblIntake.EnrollDate)) + '/' + 
CONVERT(Varchar(10),YEAR(GETDATE()))As DateTime)) <= DATEADD(d, 45, GETDATE()) 

所以,我有這個奇妙的查詢。一切都運行正常,直到用戶在tblIntake中輸入ENROLLDATE的閏年日期。我將如何去修復它?我的另一個UNION做同樣SELECT聲明的除外用於當它

CONVERT(VARCHAR(10),YEAR(GetDate()-1)) as DateTime > '4th line from the bottom 
CONVERT(VARCHAR(10),YEAR(GetDate()-1)) as DateTime > '2nd line from the bottom 

編輯:

收到此錯誤,當我運行查詢

消息242,級別16,狀態3,第1行
將varchar數據類型轉換爲日期時間數據類型導致超出範圍的值。

我試圖運行單獨的查詢,而且好像我只發現了錯誤當我這樣做..

CONVERT(VARCHAR(10),YEAR(GetDate()-1)) as DateTime > '4th line from the bottom 
CONVERT(VARCHAR(10),YEAR(GetDate()-1)) as DateTime > '2nd line from the bottom 

UNION畢竟

編輯2:

我一直在努力解決肖恩的答案,這更有意義。這裏是我已經得到了代碼....

SELECT 'CSC' = case when tblIntake.staffID is null Then '<notIndicated>' Else (tblStaffMember.staffLast + ',' + tblStaffMember.StaffFirst + case when tblStaffMember.staffMI is null then '' else ' ' + tblStaffMember.staffMI END)end 
, tblMember.[Last], tblMember.[First] 
,'Due' = DateADD(m,6,cast(tblIntake.enrolldate as datetime)) 
,'Type' = '6 Month Review' 
from tblMembEnrollment 
left join tblStaffMember on tblIntake.staffID = tblStaffMember.staffID 
left join tblMember on tblIntake.SBkey=tblMember.sbkey 
where tblIntake.unEnrollDate is null and dateAdd(m, 6, tblIntake.enrolldate) > GETDATE() 
and dateadd(m, 6, cast(tblIntake.enrolldate as DateTime))<= DateAdd(d,45,GetDate()) 

我看到的問題是,在舊的查詢,當代碼需要拆開EnrollDate到日,月,年,多年來它使用獲取日期,請參見下面的*** ****

Where tblIntake.UnEnrollDate Is Null AND 
DATEADD(m,6,CAST(CONVERT(Varchar(10),MONTH(tblIntake.EnrollDate)) + '/' + 
CONVERT(Varchar(10),DAY(tblIntake.EnrollDate)) + '/' + 
CONVERT(Varchar(10),***YEAR(GETDATE()))As DateTime))*** > GETDATE() 

之間現在是更容易做到這樣,因爲他沒有把它拆開,怎麼回事,我可以用我的全部登記日期做。

+0

返回的錯誤是什麼?你有什麼嘗試? – AXMIM

+1

去修理... *什麼*?怎麼了?它是否打破了一個錯誤?如果是這樣,那麼信息是什麼?你會得到意想不到的結果?如果是這樣,請描述。 –

+0

@BobKaufman請參閱編輯。我沒有02/29/2016測試它,它工作正常,如果我測試它 - 得到這個錯誤。 – FatBoySlim7

回答

3

如果我明白你在這裏試圖做什麼,你可以大大簡化這一點。請注意,我在別處使用了別名,而不是一遍又一遍地重複表名。此外,我使用日期名稱而不是縮寫,因爲它們更清晰。最後但並非最不重要的,我只是使用現有的日期時間值。我將它們轉換爲日期數據類型,因爲現有邏輯正在將它轉換爲日期值以避免時間部分。這在2005年日期數據類型添加之前相當常見。我還將所有嵌套的case表達式減少爲更容易閱讀的內容。

SELECT 'ITV' = ISNULL(sm.StaffLast + ', ' + sm.StaffFirst + ISNULL(' ' + sm.StaffMI, ''), '<Unknown>') 
    , tblMember.[LAST] 
    , tblMember.[FIRST] 
    , 'DueDate' = DATEADD(month, 6, convert(date, tblIntake.EnrollDate)) 
    , 'Type' = '6 Month Appt' 
From tblIntake i 
LEFT JOIN tblStaffMember sm ON i.StaffID = sm.StaffID 
LEFT JOIN tblMember m ON i.KEY = m.KEY 
Where i.UnEnrollDate Is Null 
    AND DATEADD(month, 6, convert(date, i.EnrollDate)) > GETDATE() 
    AND DATEADD(month, 6, convert(date, i.EnrollDate)) <= DATEADD(day, 45, GETDATE()) 

- 編輯 -

隨着規則的透明度,我認爲這應該是你在找什麼。這具有SARGable的優勢,因此可以使用i.EnrollDate上的任何索引。

Where i.UnEnrollDate Is Null 
    AND convert(date, i.EnrollDate) > DATEADD(month, -6, GETDATE()) 
    AND convert(date, i.EnrollDate) <= DATEADD(day, -45, GETDATE()) 
+0

這看起來不錯,但請參閱編輯。我想我正在努力重新編寫查詢,使其更簡單,因爲它不會做任何複雜的事情。就像你說的那樣,這個查詢是在較老的系統中使用的,並且是爲這個報告導入的請參閱編輯。 – FatBoySlim7

+0

你知道這應該做什麼嗎?還是你必須把別人的混亂分解成可用的東西?如果你知道規則,我們可以使這更簡單。解密它更具挑戰性。 –

+0

這是一個正在工作的查詢。跳躍日期是什麼導致我重寫它。基本上,這個應該做的就是在未來的45天內把所有的名字和顯示名字(第一,最後,MI)的'6個月預約'交給誰。 – FatBoySlim7

2

我與dateadd取代所有這些日期部分和convert S,是這樣的:

declare @test datetime 
set @test = '2-29-2016' 

select cast(@test as varchar(11)) 
, cast(dateadd(mm, 6, @test) as varchar(11)) 
, cast(dateadd(yy, -1, @test) as varchar(11)) 

如果保留日期的日期時間,SQL Server將閏年自動修正,更短的幾個月,等。上面的查詢返回:

Feb 29 2016 Aug 29 2016 Feb 28 2015