我的存储过程接受一个参数,它是一个日期时间。如果没有传递参数,我将其默认为getdate()
函数:
ALTER PROCEDURE [dbo].[myexport]
(
@start datetime = null
)
AS
BEGIN
SET NOCOUNT ON;
set @start = isnull(@start, getdate())
当我运行没有参数的存储过程时,我的结果是正确的。当我传递一个日期参数时,我收到以下错误:
exec myexport '2013-04-22 00:00:00:00'
Msg 245, Level 16, State 1, Procedure myexport, line 16
Conversion failed when converting the varchar value '(-) 0mms' to data type int.
以下是我的@start日期的上下文:
select
count(distinct pid),
'Inpatient Hosp'
from
form_names fn
inner join form_items fi on fn.id = fi.form_name
inner join form_records fr on fn.id = fr.form_name
left outer join form_answers fa on fi.id = fa.form_item and fa.form_record = fr.id
where
fn.name like '%Transfer of Health Information%'
and dateadd(dd, 0, datediff(dd, 0, fr.date)) = dateadd(dd, 0, datediff(dd, 0, @start))
and fi.text like '%date of return%'
and fa.id is NULL
编辑 -
我的存储过程ID相当大,有很多子查询,但我认为我找到了有问题的查询:
select
count(*),
'PPD +'
from
form_records fr
inner join form_names fn on fn.id = fr.form_Name
inner join form_items fi on fn.id = fi.form_name
inner join form_answers fa on fr.id = fa.form_record
and fa.form_item = fi.id
where
fn.id = 3
and fa.form_item = 30
and fa.text not like '%neg%'
and dateadd(dd, 0, datediff(dd, 0, fa.entered_date)) = dateadd(dd, 0, datediff(dd, 0, @start))
and CAST(fa.text AS INT) >= 10
当我使用getdate()
手动运行此查询时,我的结果是正确的,但当我使用'2013-04-22 00:00:'00
运行时,我收到错误。
fa.entered_date
的数据类型为datetime
。
任何帮助都将不胜感激。
答案 0 :(得分:1)
我认为你添加了太多的00。
试试这个:exec myexport '2013-04-22 00:00:00'
答案 1 :(得分:1)
不确定您在上次查询时尝试做什么。但是,语法应该是
DATEADD (datepart , number , date )
你有
dateadd(dd, 0, datediff(dd, 0, @start))
DATEDIFF返回 INT
您需要更改查询
答案 2 :(得分:1)
使用明确的格式指定日期可能会有所帮助。使用例如
'20130422'
或
'2013-04-22T10:57:33.007'
其他任何事情都可能会产生歧义;例如在某些情况下,SQL Server会将2013-04-22
或2013-04-22 10:57:33.007
解释为来自第22个月的第4个日期并且转换失败。
另外,对于您的查询,我将其运行为:
and fr.date> = @start and fr.date < DATEADD(day,1,@start)
在查询运行之前设置@start
:
set @start = DATEADD(day,DATEDIFF(day,0,@start),0)
这意味着如果索引包含fr.date
,则至少有可能使用该索引。