2015-09-10 96 views
0

我有一個程序,用戶輸入月份,例如'JAN'來提取當月的數據。我想比較輸入月份和日期中的月份部分。這是我到目前爲止。提取月份數量?

CREATE PROCEDURE SavingsAccountsAllDetail 
(@Yr INT=NULL, 
@Mon CHAR(3)=NULL) 

AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @Year INT 
    DECLARE @Month CHAR(3) 

    SET @Year = @Yr 
    SET @Month = @Mon 

和比較部分。

datepart(year, A.DateOpen)[email protected] AND datepart(month, A.DateOpen)=datepart(MM, @Month) 

但是,當我執行我的程序它說,從性格 字符串轉換日期和/或時間時

轉換失敗。嚴重性16

有關如何繼續的任何想法?

回答

1

您使用DATEPART,但它傳遞你的財產稱爲@Mon這是一個CHAR(3),他不能轉換這個CHAR(3)Date,因此錯誤。

@Mon參數應該是一個Int@Yr和您的查詢是

datepart(year, A.DateOpen)[email protected] AND datepart(month, A.DateOpen) = @Month 
+0

我希望用戶以'JAN'格式輸入月份。如何比較這與日期的月份? –

+0

然後檢查Pravin的答案,這正是你想要做的。請注意,根據計算機的區域設置,它可能無法正常工作(例如,如果區域設置爲法語,則可能會返回Janvier),並且使用月份編號的代碼方式可能更安全。 – Gimly

0

代替datepart使用datename,它現在將(十二月即12)返回你一個月的,而不是本月指數的名稱

然後獲取返回的月份的前三個字母與您輸入的字符串進行比較

用於比較

datepart(year, A.DateOpen)[email protected] AND left(datename(month, A.DateOpen),3)[email protected] 
1

@Year@Month變量不是日期。它們是日期部分的字符串表示。

當你提取A.DateOpen你可以直接比較,爲這些變量的日期部分:

datepart(year, A.DateOpen)[email protected] AND datepart(month, A.DateOpen)[email protected] 

然而,datepart會返回一個數值,你要比較的文字(如「JAN」)。考慮加入「DATENAME()函數,並更改行:

datepart(year, A.DateOpen)[email protected] AND left(datename(month, A.DateOpen), 3)[email protected] 
+0

完美.. Thanx ... –

+0

只是注意到,哪個日期使用它只顯示月月。試試這個:SELECT datepart(year,'4/26/2015 12:00:00 AM'),left(datename(month,datepart(month,'4/26/2015 12:00:00 AM)), 3) –

+0

@DeEDEe你是對的;我不小心在那裏留下了一個'DatePart()'......最後的聲明改變了,現在應該可以工作。 – steenbergh

0

請儘量將像查詢

DECLARE @inpMonth CHAR(3) = 'SEP' 
SELECT CASE WHEN @inpMonth = FORMAT(GETDATE(),'MMM') THEN 1 ELSE 0 END AS [res] 

我在使用SQL Server 2012

0

你所得到的錯誤從

datepart(month, A.DateOpen)=datepart(MM, @Month) 

@Month可以具有值JanFeb等。其中sql server無法轉換爲正確的日期。

@month的值設爲@Mon like;

DECLARE @Month int 
select @Month = 
    case @Mon 
    when 'Jan' then 1 
    when 'Feb' then 2 
    when 'Mar' then 3 
    when 'Apr' then 4 
    when 'May' then 5 
    when 'Jun' then 6 
    when 'Jul' then 7 
    when 'Aug' then 8 
    when 'Sep' then 9 
    when 'Oct' then 10 
    when 'Nov' then 11 
    when 'Dec' then 12 
    else 0 
end 

並在查詢中使用@month;

datepart(year, A.DateOpen) = @Year AND datepart(month, A.DateOpen) = @Month