2017-08-25 4 views
0

特定の日付範囲の値を選択するためにクエリをフィルタリングしようとしています。私のオリジナルの述語がいた:私はこれをしなかった場合はT-SQLは、2つのvarcharsを日付に変換するときにのみエラーメッセージをスローする

WHERE [TheDate] BETWEEN '2016-07-01' AND '2017-06-31' 

、私はエラーメッセージが表示されました、「datetimeデータ型にvarcharデータ型の変換は、範囲外の値になりました。」私はその文の複数のバリエーションを試みた:

WHERE [TheDate] BETWEEN CONVERT(datetime, '2016-7-1 00:00:00.000', 103) 
        AND CONVERT(datetime, '2017-6-31 00:00:00.000', 103) 

WHERE [TheDate] BETWEEN CONVERT(date, '2016-7-1', 103) 
        AND CONVERT(date, '2017-6-31', 103) 

WHERE [TheDate] BETWEEN CONVERT(date, '2016-7-1', 101) 
        AND CONVERT(date, '2017-6-31', 101) 

WHERE [TheDate] BETWEEN CAST('2016-7-1' AS date) 
        AND CAST('2017-6-31' AS date) 

をしかし、一人一人が私に同じエラーメッセージを与えました。

WHERE [TheDate] > CAST('2016-7-1' AS date) 

そしてプレスト - それが働いた:

はその後、ちょうどそれを一体のために、私はこれを試してみました。だから私はこれを試しました:

WHERE [TheDate] > CAST('2016-7-1' AS date) 
AND [TheDate] < CAST('2017-6-31' AS date) 

もう一度エラーメッセージが表示されます。私は複数のバリエーションを試して続けたが、結論はこれです:

  1. 私はdateまたはdatetimeに変換するために2つのvarchar列にCASTまたはCONVERTを使用している場合は、私は関係なく、私の構文の、エラーメッセージが表示されます、機能選択は、など

  2. 私はdateまたはdatetimeに変換する1つのvarchar列にCASTまたはCONVERTを使用している場合、変換は問題なく動作します

これを引き起こす可能性のあるアイデアは誰にもありますか?

ありがとうございました。

+7

'June 31'は有効な日付ではありません。 – Siyual

答えて

1

これまで説明したように、june 31は有効な日付ではありません。ここで

あなたは現在の月の最後の日を見つけるために、どのように見ることができます

https://blog.sqlauthority.com/2007/08/18/sql-server-find-last-day-of-any-month-current-previous-next/

----Last Day of Previous Month 
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0)) 
LastDay_PreviousMonth 
----Last Day of Current Month 
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0)) 
LastDay_CurrentMonth 
----Last Day of Next Month 
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+2,0)) 
LastDay_NextMonth 

ちょうどあなたの場合には、最後の日、あなたを与えるだろうあなたの日付とGETDATE()をreplancing

declare @iniDate date 
declare @endDate date 

set @iniDate='2016-07-01' 
set @endDate= DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@iniDate)+1,0)) 

WHERE [TheDate] BETWEEN @iniDate AND @endDate 
+0

ありがとうHoraciux。私はちょうど述語で日付範囲を必要とする別のクエリに取り組んでいましたが、今回は私が何をしているのか分かりました。また、上記のコードにも感謝します。実際には、必要な日付を得るためのより良い方法です。 – Chris

関連する問題