2016-05-03 13 views
0

次のSQL文を使用しようとしていますが、すぐにクエリを実行しようとしています'datetimeを文字列に変換すると変換できませんでした。 'エラーメッセージ。where句でdatetimeを文字列から変換するときに変換に失敗しました

私は、periodperをdatetimeで有効にするにはwhere句のdateと同様にfiscalperiodを変換しようとしましたが、datetimeクエリでフィルタを使用するとすぐに失敗します。

私はtempテーブルに同じ結果を格納し、次にtempテーブルで日付フィルタを使用すると、期待される結果が得られます。

以下のクエリで何が間違っているか確認してください。

WITH TEMP_LEDGERPERIOD (DATAAREAID, PERIODSTART, PERIODEND, FISCALPERIOD) 
AS 
(
    SELECT dataareaid, PERIODSTART, PERIODEND, CONVERT(DATETIME, '01-' + COMMENTARIES) AS FiscalPeriod 
    FROM LEDGERPERIOD LPT WITH (NOLOCK) 
    WHERE (COMMENTARIES NOT LIKE '%OPEN' and COMMENTARIES NOT LIKE '%CLOSE') 
) 

Select * 
from TEMP_LEDGERPERIOD 
where FiscalPeriod BETWEEN '2016/01/01' AND '2016/02/01' 
+0

「解説」はどのように見えますか? –

+0

はWHERE句、またはCONVERT関数でエラーですか? WHERE句をコメントアウトして、まだエラーが発生していないかどうかを確認してください。 – FLICKER

答えて

1

日付を使用する場合は、ISO標準の日付形式を使用するか、明示的にコンバージョンを行う必要があります。 COMMENTARIESのようなものは何も分かりませんが、日付の冒頭にある「01-」はほとんどありません。

さらに、CASEを使用しない限り、SQL Serverは式の評価順序を保証しません。したがって、WHERE句のフィルタリングは、の後にの新しい値の計算が行われることがあります。幸いにも、SQL Server 2012+はTRY_CONVERT()を提供しています。

WITH TEMP_LEDGERPERIOD (DATAAREAID, PERIODSTART, PERIODEND, FISCALPERIOD) AS (
     SELECT dataareaid, PERIODSTART, PERIODEND, 
      TRY_CONVERT(DATETIME, COMMENTARIES + '-01') AS FiscalPeriod 
     FROM LEDGERPERIOD LPT WITH (NOLOCK) 
     WHERE COMMENTARIES NOT LIKE '%OPEN' and COMMENTARIES NOT LIKE '%CLOSE' 
    ) 
Select * 
from TEMP_LEDGERPERIOD 
where FiscalPeriod BETWEEN '2016-01-01' AND '2016-02-01'; 

最後に、あなたはBETWEENが包括的であることを認識しませんので、これは2月の最初の日が含まれています。私はCOMMENTARIESの形式は「YYYY-MM」であると仮定した場合

、あなたがのために行くことができます。

+0

これは、 '' JAN-16'のように ''01 -''を' MMM-YY'の前に置くと意味があると思います。おそらく変換する_safer_の方法があるとは認められますが、それはうまくいくはずです。 –