2012-11-01 53 views
0

我有一個巨大的數據庫在MS SQL。我有一個日期存儲到類型的字段:VARCHAR2 我有代碼,但它無法比較日期。我的意思是?有一個發佈日期的輸入。我需要的是獲取launchdate輸入,其中launchdate大於日期而小於另一個日期。問題是,當我從2012年更改到2013年時,沒有結果。另外當我有0的日期(如01.01.2012)它不能編譯它們。MS SQL 2005無法比較日期

我至今是:

edited 

有人可以幫助我得到正確的結果?

EDIT1

日期存儲爲字符串格式爲:YYYY-MM-DD

+1

首先你爲什麼在字符串(* VARCHAR2 *)上存儲日期?爲什麼不直接使用'DATE'或'DATETIME'? –

+0

而不是轉換爲日期,然後返回到varchar,只是轉換爲日期。最好還是在日期時間列中存儲日期,不要轉換任何東西。 – Laurence

+0

@John Woo這是一個現有的數據庫,我試圖從中得出結果。 :( – Slim

回答

1

在你WHERE條款你不必要做了雙轉換,實際上比較VARCHARDATETIME

要比較DATETIME以下就足夠了。

CONVERT(DATETIME, p11.pa_value,104) >= CONVERT(DATETIME, '01.01.2012',104) 

或者你可以CAST

CAST(p11.pa_value AS DATETIME) >= CAST('01.01.2012' AS DATETIME) 

編輯:我認爲你需要檢查的[t].PA_NAME以及

ISNULL([t].PA_NAME,'') = 'yourString' --if you need filter null PA_NAME 
ISNULL([t].PA_NAME,'yourString') = 'yourString' --if you need to bring null PA_NAME 
+0

當我運行它時沒有結果 – Slim

+0

可能是由於其他原因。檢查您的查詢或/和數據 – Kaf

+0

它可能是任何那些'PA_NAME'爲NULL,所以在這種情況下,您可以去ISNULL(t.PA_NAME,'')='YourString'。或者你可以在你的'WHERE'子句中使用它們。 – Kaf

1
select 
p1.PA_VALUE as Quote_number, 
p2.PA_VALUE as Project_Name, 
p3.PA_VALUE as requestNumber, 
p4.PA_VALUE as reqLocation_CHECK, 
p5.PA_VALUE as reqActivityCode, 
p6.PA_VALUE as reqSegment, 
p7.PA_VALUE as reqTotalPRLocalMargin_CHECK, 
p8.PA_VALUE as reqDiscountPerc_CHECK, 
p10.PA_VALUE as RequisitionerName, 
p11.PA_VALUE as Date_Start, 
p13.PA_VALUE as reqTotalPRNetNet_CHECK, 
p14.PA_VALUE as reqCustomerNumber, 
p15.PA_VALUE as Is_Validated 


from WP_WorkflowProcess p 
LEFT JOIN PA_PARAMETER p1 on p1.PA_WP_ID=p.WP_ID AND p1.PA_NAME = 'reqQuoteNumber' 
LEFT JOIN PA_PARAMETER p2 on p2.PA_WP_ID=p.WP_ID AND p2.PA_NAME = 'reqProjectName' 
LEFT JOIN PA_PARAMETER p3 on p3.PA_WP_ID=p.WP_ID AND p3.PA_NAME = 'RequestNumber' 
LEFT JOIN PA_PARAMETER p4 on p4.PA_WP_ID=p.WP_ID AND p4.PA_NAME = 'reqCustomerLocation' 
LEFT JOIN PA_PARAMETER p5 on p5.PA_WP_ID=p.WP_ID AND p5.PA_NAME = 'reqActivityCode' 
LEFT JOIN PA_PARAMETER p6 on p6.PA_WP_ID=p.WP_ID AND p6.PA_NAME = 'reqSegment' 
LEFT JOIN PA_PARAMETER p7 on p7.PA_WP_ID=p.WP_ID AND p7.PA_NAME = 'reqTotalPRLocalMargin' 
LEFT JOIN PA_PARAMETER p8 on p8.PA_WP_ID=p.WP_ID AND p8.PA_NAME = 'reqDiscountPerc' 
LEFT JOIN PA_PARAMETER p10 on p10.PA_WP_ID=p.WP_ID AND p10.PA_NAME = 'RequisitionerName' 
LEFT JOIN PA_PARAMETER p11 on p11.PA_WP_ID=p.WP_ID AND p11.PA_NAME = 'LaunchDate' 
LEFT JOIN PA_PARAMETER p13 on p13.PA_WP_ID=p.WP_ID AND p13.PA_NAME = 'reqTotalPRNetNet' 
LEFT JOIN PA_PARAMETER p14 on p14.PA_WP_ID=p.WP_ID AND p14.PA_NAME = 'reqCustomerNumber' 
LEFT JOIN PA_PARAMETER p15 on p15.PA_WP_ID=p.WP_ID AND p15.PA_NAME = 'isValidated' 


WHERE p.WP_TYPE = 'EnergyMarketing' 
AND CONVERT(DATETIME, p11.pa_value) >= CONVERT(DATETIME, '01.01.2012') 
AND CONVERT(DATETIME, p11.pa_value) <= CONVERT(DATETIME, '01.09.2012') 
+0

它給我沒有結果:( – Slim

+0

請檢查數據是否適用於給出的條件:像第一個刪除p.WP_TYPE ='EnergyMarketing'.. – jainvikram444

+0

並且還檢查數據是否可以在'01 .01.2012'和' 01.09.2012' – jainvikram444

1

NULL值嘗試

WHERE CONVERT(DATETIME, p11.pa_value, 104) >= CONVERT(datetime, '01.01.2012', 104) 
1

除了關於多重數據類型轉換的其他答案外,請注意您在文字字符串中呈現日期的格式。在我的SQL服務器(英國地區)上,日期01.09.2012轉換爲2012-01-09(1月9日)。

由於您只需要9天的數據而非9個月的數據,因此您的查詢可能不會返回任何數據。

看看my answer to a sql date problem question下關於日期格式的評論。