如何将Datetime值作为参数传递给存储函数?

时间:2017-07-20 08:02:24

标签: sql sql-server datetime

我在SQL SERVER中创建了一个函数,它接受参数的日期时间值,当我尝试执行它时,我不知道如何将Datetime值作为参数传递给此函数,我收到此错误:无法从字符串转换日期和/或时间。

这是我的功能代码:

CREATE FUNCTION [dbo].[nb_pieces_produites] (@dateInsertion datetime)
returns decimal(4,0)
AS
BEGIN

DECLARE @year decimal(4,0), @month decimal(2,0), @day decimal(2,0) ,@hour 
decimal(2,0), @nbPiecesProduites decimal(4,0)

set @year = (select DATEPART(yyyy, @dateInsertion))
set @month = (select DATEPART(mm, @dateInsertion))
set @day = (select DATEPART(dd, @dateInsertion))
set @hour = (select DATEPART(hh, @dateInsertion))

set @nbPiecesProduites = (SELECT COUNT(DISTINCT Num_Serie) FROM [dbo].
[dbo_Test] WHERE @dateInsertion BETWEEN '@year-@month-@day @hour:00:00' AND 
'@year-@month-@day @hour:59:59')

return @nbPiecesProduites
END

这是我的疑问:

select [dbo].[nb_pieces_produites]('2017-06-19 11:38:52')

有人可以帮我吗?

3 个答案:

答案 0 :(得分:4)

不要花费大量时间摆弄字符串 - 尽量将数据保存为datetime数据。

要将日期时间向下舍入到前一个小时边界,请使用DATEADD / DATEDIFF对:

CREATE FUNCTION [dbo].[nb_pieces_produites] (@dateInsertion datetime)
returns decimal(4,0)
AS
BEGIN

set @nbPiecesProduites = (SELECT COUNT(DISTINCT Num_Serie) FROM [dbo].
[dbo_Test] WHERE
date_column_from_table >= DATEADD(hour,DATEDIFF(hour,0,@dateInsertion),0)
   AND
date_column_from_table < DATEADD(hour,DATEDIFF(hour,0,@dateInsertion)+1,0)
)

return @nbPiecesProduites
END

而且,为了安全起见,请这样称呼:

select [dbo].[nb_pieces_produites]('2017-06-19T11:38:52')

(有时,在某些情况下,SQL Server会将nnnn-nn-nn解释为yyyy-dd-mm而不是yyyy-mm-dd,如果它后跟 space 然后是时间,而不是使用T作为分隔符)

答案 1 :(得分:1)

这是错误,因为你的函数需要dateTime值,但是当你调用它时你传递字符串而不是dateTime

将您的查询更改为:

select [dbo].[nb_pieces_produites](getDate())

答案 2 :(得分:0)

CREATE FUNCTION [dbo].[nb_pieces_produites] (@dateInsertion datetime)
RETURNS decimal(4,0)
AS
BEGIN
    RETURN 
    (
        SELECT COUNT(DISTINCT Num_Serie) 
        FROM dbo.dbo_Test 
        WHERE 
            -- Use the date part to compare
            CONVERT(date, [datetimecolumn]) = CONVERT(date, @dateInsertion) 
            -- Then compare with hour
            AND DATEPART(HOUR, [datetimecolumn]) = DATEPART(HOUR, @dateInsertion)
    )
END