2011-07-05 2 views
-1

以下のtsqlクエリを開発しています。 「1900%」を含むレコードはどのようにして識別できますか?T-SQLでDATETIME NULLレコードを識別する方法は?

SELECT DISTINCT TICKET, COMPLAINT_LEVEL, COMPLETION_DATE, DATE_FILTER, YEAR(DATE_FILTER) AS YEAR_FILTER, MONTH(DATE_FILTER) AS MONTH_FILTER, 
left(datename(month, DATE_FILTER), 3) + ' ''' + 
RIGHT(year(DATE_FILTER), 2) AS SHORT_DATE_FILTER, 
CASE WHEN DATE_FILTER < MONTH_END AND MONTH_END < CURRENT_DATE_END AND COMPLETION_DATE IS NULL THEN DATE_FILTER 
WHEN DATE_FILTER < MONTH_END AND MONTH_END < CURRENT_DATE_END AND 
COMPLETION_DATE IS NOT NULL AND ABS(DATEDIFF(DAY, COMPLETION_DATE, MONTH_END)) >= 1 AND DATE_FILTER < CURRENT_DATE_END THEN DATE_FILTER 
ELSE 0 END AS ROW_TYPE 
FROM #TEMP 
--WHERE row_type = 0 
--line above does not work 

そして、このことは、NULL値を持って何の日時が存在しないと思われ

答えて

1

enter image description here ように私の出力が見えるものです。

row_typeをチェックするだけでも魅力的ですが。それは動作しません、それは計算された列です。 row_typeを調べるには、スクリプトをこれに変更する必要があります。そうしないと、計算列を生成する式全体と比較する必要があります。

SELECT * FROM (
SELECT DISTINCT TICKET, COMPLAINT_LEVEL, COMPLETION_DATE, DATE_FILTER, YEAR(DATE_FILTER) AS YEAR_FILTER, MONTH(DATE_FILTER) AS MONTH_FILTER, 
left(datename(month, DATE_FILTER), 3) + ' ''' + 
RIGHT(year(DATE_FILTER), 2) AS SHORT_DATE_FILTER, 
CASE WHEN DATE_FILTER < MONTH_END AND MONTH_END < CURRENT_DATE_END AND COMPLETION_DATE IS NULL THEN DATE_FILTER 
WHEN DATE_FILTER < MONTH_END AND MONTH_END < CURRENT_DATE_END AND 
COMPLETION_DATE IS NOT NULL AND ABS(DATEDIFF(DAY, COMPLETION_DATE, MONTH_END)) >= 1 AND DATE_FILTER < CURRENT_DATE_END THEN DATE_FILTER 
ELSE 0 END AS ROW_TYPE 
FROM #TEMP) a 
WHERE YEAR(ROW_TYPE) = 1900 
0

これは、同様に動作します:正しく指摘している

WHERE ROW_TYPE = 0 

しかし、@t-clausen.dkとして、ROW_TYPE列は同じSELECTのWHERE句で参照することはできません。通常、内側のSELECTのすべてのエイリアスにアクセス可能な外側のSELECTを追加します。

+0

上記のSQLでは動作しません。計算列と比較することはできません。それでも、それは1900年の最初の日にしか動作しません。しかし、それはテストデータによれば十分であるようです。 –

+0

数値は 'date'データ型と互換性がありません。しかし、 'ROW_TYPE'は明らかに' datetime'です。なぜ私は上記のクエリではうまくいかないと思うのか分かりません。この単純な例は、 'SELECT * FROM(SELECT GETDATE()UNION ALL SELECT 0)x(d)WHERE d = 0')を示しているようです。クエリは '1900-01-01 00:00:00.000'の値を持つ1つの行を返します。 –

+0

私のコメントを明確にするために私の解決策を読む必要があると思う –