0

我的存储过程接受一个参数,它是一个日期时间。如果不传参数,我默认给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_datedatetime.

任何帮助,将不胜感激。

4

3 回答 3

1

不确定您在上次查询中尝试做什么。但是,语法应该是

DATEADD (datepart , number , date )

你有

dateadd(dd, 0, datediff(dd, 0, @start))

DATEDIFF 返回INT

您需要更改您的查询

于 2013-04-29T14:50:58.617 回答
1

使用明确的格式来指定日期可能会有所帮助。使用例如

'20130422'

或者

'2013-04-22T10:57:33.007'

其他任何事情都可能会模棱两可;例如,在某些情况下,SQL Server 会将2013-04-22or解释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,则至少有可能使用该索引。

于 2013-04-29T14:51:56.437 回答
1

我认为你添加了太多的 00。

尝试这个:exec myexport '2013-04-22 00:00:00'

于 2013-04-29T14:43:43.753 回答