【问题标题】:SQL Server Stored Procedure Conversion failed when converting date and/or time from character string从字符串转换日期和/或时间时 SQL Server 存储过程转换失败
【发布时间】:2017-11-06 16:28:51
【问题描述】:

我知道这个问题已被问过几次,但这些建议似乎对我不起作用。我有一个 83 行的存储过程,我需要调用它并将开始和结束日期传递给它。如果我对日期进行硬编码,该过程会非常有效;但是,当我尝试将日期作为变量传递时,我收到错误:

从字符串转换日期和/或时间时转换失败

我按如下方式调用我的存储过程:

exec dbo.CreateReport @startDate = '10/01/2013', @endDate = '12/31/2013'

我正在按如下方式创建我的存储过程:

create procedure dbo.CreateReport 
    @startDate smalldatetime = NULL, 
    @endDate smalldatetime = NULL

发生错误的代码块:

declare vp_laboraccount_timesheetitem_cursor cursor for 
            select a.laborleveldsc1,a.laborleveldsc2,a.laboracctid, sum(b.durationsecsqty)/3600 as totalhours
            from vp_laboraccount a, timesheetitem b
            where a.laboracctid=b.laboracctid and b.eventdtm >=''' + @@startDate + ''' and b.eventdtm <= ''' + @@endDate + ''' and employeeid = @personid
            group by a.laborleveldsc1,a.laborleveldsc2,a.laboracctid
            open vp_laboraccount_timesheetitem_cursor
            fetch next from vp_laboraccount_timesheetitem_cursor into @laborleveldsc1,@laborleveldsc2,@laboracctid,@totalhours
            while @@fetch_status=0
            begin
            --print results
                select @message = @personid + ',' + @personcstmdatatxt + ',' + @searchfullnm + ',' + @prdohh + ',' + @prjob1 + ',' + @laborleveldsc1 + ',' + @laborleveldsc2 + ',' + @laboracctid + ',' + @totalhours + ',' + @companhiredtm
                --print @message
                insert into dbo.tabResults (messages) Values(@message)
            fetch next from vp_laboraccount_timesheetitem_cursor into @laborleveldsc1,@laborleveldsc2,@laboracctid,@totalhours
            end
            close vp_laboraccount_timesheetitem_cursor
            deallocate vp_laboraccount_timesheetitem_cursor

发生错误的具体行:

where a.laboracctid=b.laboracctid and b.eventdtm >=''' + @@startDate + ''' and b.eventdtm <= ''' + @@endDate + ''' and employeeid = @personid

有问题的两个变量是@@startDate 和@@endDate。

我尝试了几件事,包括将我的变量作为 varchar 传递,以及对变量进行转换和强制转换,但似乎没有什么对我有用。我尝试了单@和双@@符号,因为它们经常给我带来问题。我尝试过不同的日期格式,但每次我收到相同错误消息的变体。如果我将日期字符串硬编码到代码中,它会按预期工作,并且不会出错。

我认为我非常迟钝,一旦有人用铁锹敲打我的头,解决方案就会很明显,但经过一周的各种尝试后,我准备寻求帮助。

我做错了什么,我该怎么做才能解决这个问题?

谢谢。

【问题讨论】:

标签: sql sql-server tsql stored-procedures sql-server-2014


【解决方案1】:

SQL Server 中唯一真正安全的日期/时间文字格式(至少对于 datetimesmalldatetime 而言)是:YYYYMMDDYYYY-MM-DDThh:mm:ss[.nnn] - Bad habits to kick : mis-handling date / range queries - Aaron Bertrand

为您的变量使用单个 @

exec dbo.CreateReport @startDate='20131001', @endDate='20131231'

你的where 子句应该是这样的:

where a.laboracctid=b.laboracctid
  and b.eventdtm >= @startDate
  and b.eventdtm <= @endDate
  and employeeid = @personid

此外,您应该使用正确的联接而不是旧式联接并使用有意义的别名。

【讨论】:

  • 删除引号和连接符有效。我对此进行了尝试,但从未真正尝试过完全删除它们。感谢 scsimon 和 SqlZim 的建议和帮助。我也会看看其他建议,因为我总是愿意让我的东西变得更好。
  • @user3788019 乐于助人!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多