0

ms sqlに巨大なデータベースがあります。タイプのフィールドに日付が格納されていVARCHAR2 ます。コードはありますが、日付を比較できません。私が意味したのは?発売日の入力があります。私が必要とするのは、launchdate が日付よりも大きく、別の日付よりも小さい launchdate 入力を取得することです。問題は、年を 2012 年から 2013 年に変更すると、結果が得られないことです。また、日付が 0 (01.01.2012 など) の場合、それらをコンパイルできません。

私がこれまでに持っているものは次のとおりです。

edited

誰かが正しい結果を得るのを手伝ってくれますか?

編集1

日付は次の形式の文字列として保存されます: yyyy-mm-dd

4

4 に答える 4

1

あなたのWHERE句では、不必要に二重変換を行っており、実際には比較してVARCHAR いません DATETIME

以下を比較する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)

EDIT:NULLの値も[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
于 2012-11-01T12:15:50.523 に答える
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')
于 2012-11-01T12:13:26.050 に答える
1

試す

WHERE CONVERT(DATETIME, p11.pa_value, 104) >= CONVERT(datetime, '01.01.2012', 104)
于 2012-11-01T12:16:22.173 に答える
1

複数のデータ型変換に関する他の回答に加えて、リテラル文字列に表示する日付の形式に注意してください。私の SQL サーバー (英国地域) では、日付は(1 月 9 日) に01.09.2012変換されます。2012-01-09

9 か月ではなく 9 日分のデータのみを要求しているため、クエリはデータを返さない可能性があります。

使用する日付形式に関するSQL 日付問題の質問に対する私の回答の下のコメントを見てください。

于 2012-11-01T12:30:42.420 に答える