我有一个SQL查询,是由一位已经离开的同事编写的。该查询作为SSIS作业的一部分运行,但从本月开始出现以下错误:
将varchar数据类型转换为datetime数据类型时发生了超出范围的值错误。
查询本身只是一个基本的select语句,其中包含一个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
这项工作每月运行两次。一次是在当月的16日,用于处理本月1日至15日的数据;另一次是在下个月1日,用于处理上个月16日到月底的数据。
根据我在网上找到的信息,strStartDate
使用 varchar
可能是罪魁祸首?我对 SQL 不够熟悉,不知道如何替换其中的所有转换内容?另外,有没有更好的方法确定月底日期,而不是获取运行时间?任何帮助都将不胜感激。
(补充一下,我们在 SQL Server 2008 R2 上运行此作业),我与数据库管理员核实过,他说 SQL 服务器上没有更改地域设置。
SET @StartDate = DATEADD(month,DATEDIFF(month,'20010101',@RunDate),'20001216')
,它应该总是能找到它(保持两个字符串常量完全相同)。 - Damien_The_Unbeliever@RunDate
之间发生了多少个月份。然后它将这同样数量的月份加到2000年12月16日。如果你想一想,这应该总是产生比@RunDate
更早一个月的第16天。 - Damien_The_UnbelieverSELECT Count(*) from xxx WHERE startdate BETWEEN '20121216' and '20130101'
以查看是否会生成错误。此外,您可以运行代码部分并添加几个selects,例如Select @strStartDate
和select @StartDate
,以了解它正在做什么。 - sgmoore