我有一个不再在这里的同事编写的 SQL 查询。该查询作为 SSIS 作业的一部分运行,并且截至本月已开始失败并出现以下错误:
将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。
查询本身只是一个带有 where 子句的基本选择,用于查找特定时间范围内的值(和 之间的日期@startdate
范围@enddate
)
确定时间范围的代码如下:
DECLARE @RunDateTime datetime
DECLARE @RunDate datetime
DECLARE @StartDate datetime
DECLARE @EndDate datetime
DECLARE @Month int
DECLARE @Year int
DECLARE @strStartDate varchar(10)
SET @RunDateTime = GetDate()
SET @RunDate = cast(round(convert(real, @RunDateTime),0,1) as datetime)
IF DATEPART(d, @RunDate) = 16
BEGIN
SET @StartDate = DATEADD(d, -15, @RunDate)
SET @EndDate = @RunDate
END
ELSE
BEGIN
IF Month(@RunDate) = 1
SET @Month = 12
ELSE
SET @Month = Month(@RunDate) - 1
IF Month(@RunDate) = 1
SET @Year = Year(@RunDate) - 1
ELSE
SET @Year = Year(@RunDate)
SET @strStartDate = CONVERT(varchar(2), @Month)+ '/16/' + CONVERT(varchar(4), @Year)
SET @StartDate = CONVERT(datetime, @strStartDate, 101)
SET @EndDate = @RunDate
END
该作业每月运行两次。每月1日至15日的数据为16日一次,16日至上月末的数据为下个月1日的数据。
我对 SQL 不够熟悉,不知道如何替换那里发生的所有转换内容?此外,有没有比仅获取运行时间更好的方法来确定月末日期?任何帮助都将不胜感激。varchar
strStartDate
(PS,我们在 SQL Server 2008 R2 上运行此作业)我与 DBA 进行了核对,他没有说 SQL 服务器上的本地化或区域设置已更改。