我尝试过滤查询以选择给定日期范围之间的值。我原来的谓词是:
WHERE [TheDate] BETWEEN '2016-07-01' AND '2017-06-31'
当我这样做时,我收到了错误消息,"将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)
和Presto - 它有效。所以我试过这个:
WHERE [TheDate] > CAST('2016-7-1' AS date)
AND [TheDate] < CAST('2017-6-31' AS date)
再次收到错误消息。我继续尝试多种变体,但结果就是:
如果我在两个CAST
列上使用CONVERT
或varchar
将其转换为date
或datetime
,则会收到错误消息,无论我的语法,功能选择等。
如果我在一个CAST
列上使用CONVERT
或varchar
将其转换为date
或datetime
,则转化无需问题
有没有人有任何想法可能导致这个?
感谢。
答案 0 :(得分:1)
如上所述,6月31日不是有效日期。
您可以在此处查看如何查找当月的最后日期
----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(),就可以在最后一天使用
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