おそらく、日付が d/m/y として解釈されている (18 番目の月がないため、最初の行が失敗する) か、最初の部分 (月) が > 12 であるデータがそこにある可能性があります。
問題のある行を見つけるには:
SELECT Value FROM [Oasis].[dbo].[vw_SALES_SalesItemDetails]
WHERE SalesItemPK IN (1425,1225,1556,1589,1599,1588,1590)
AND ISDATE(Value) = 0;
(そして、問題のある行を見つけた場合は、明らかにそれらを修正してください。)
次を使用して、値が m/d/y として解釈されることを確認することもできます (列内の他のガベージで失敗しません)。
SELECT SalesItemPK, FieldName, Value,
FirstOfMonth = CASE WHEN ISDATE(Value) = 1 THEN
DATEADD(DAY,1-DAY(CONVERT(DATETIME,Value,101)),CONVERT(DATETIME,Value,101)) END
FROM [Oasis].[dbo].[vw_SALES_SalesItemDetails]
WHERE SalesItemPK IN (1425,1225,1556,1589,1599,1588,1590)
AND FieldName = 'Estimated Ship Date'
AND CASE WHEN ISDATE(Value) = 1 THEN CONVERT(DATETIME, Value, 101)
ELSE NULL END >= '20100101';
また、PK 値に対して句を実行したからといって、WHERE
SQL Server が最初にその条件を評価する必要があるわけではないことに注意してください。ビュー内のすべての行 (つまり、ソース テーブル内のすべての行) をDATETIME
最初の行に変換しようとする可能性があります。CASE
そのため、念のため、式もSELECT
リストに追加しました。しゃれは意図されていません。また、月の初日を簡単に計算する方法についても提案しました (多くの人は、文字列に変換するなど、非常に奇妙なことをする傾向があります)。
ビューが別の列をdatetimeとして公開した場合、このクエリがどれほど単純になるか考えていますか?
, DateValue = CASE WHEN ISDATE(Value) = 1 THEN CONVERT(DATETIME, Value, 101)
次に、クエリは次のようになります。
SELECT SalesItemPK, FieldName, DateValue,
FirstOfMonth = DATEADD(DAY, 1-DAY(DateValue), DateValue)
FROM [Oasis].[dbo].[vw_SALES_SalesItemDetails]
WHERE SalesItemPK IN (1425,1225,1556,1589,1599,1588,1590)
AND DateValue >= '20100101';
FirstOfMonth
実際、ビューは計算を公開することもできます。
これらは、日付/時刻データを文字列として保存してはならない、非常に多くの、非常に多くの理由の一部です。少なくとも、ビューを変更して、これらの文字列を ではなく、言語、日付形式、および地域に完全に依存しない文字列 ( yyyymmdd
) として表示しmm/dd/yyyy
ます。