SQL Server 2008中存储过程中的数据类型转换错误

时间:2016-09-30 13:17:39

标签: sql sql-server datetime

请有人帮我解决此错误。

表格结构:

DECLARE @TABLE TABLE (MYDATE DATETIME2)


INSERT @TABLE
    SELECT 2016-08-08 10:27:58.0000000 UNION ALL
    SELECT 2016-09-25 16:55:00.0000000 UNION ALL
    SELECT 2016-01-07 10:09:00.0000000 UNION ALL
    SELECT 2016-01-07 10:10:00.0000000 UNION ALL
    SELECT 2016-02-26 16:55:00.0000000

我无权更改此表的结构。

我的存储过程:

CREATE PROCEDURE dbo.CHECKS 
    @MYDATE DATETIME 
AS
    SELECT 
        *
    FROM       
        TABLE1 t1
    INNER JOIN 
        TABLE2 t2 
    WHERE 
        CONVERT(NVARCHAR(MAX), @MYDATE, 105) = MYDATE

但客户希望传递日期参数,如

EXEC dbo.ComparePrices '25092016'

这样做会出现错误,如

  

Msg 8114,Level 16,State 1,Procedure ComparePrices,Line 0
  将数据类型varchar转换为datetime时出错。

请帮帮我。

由于

1 个答案:

答案 0 :(得分:1)

您可以使用STUFF()将分隔符插入到rigth位置。然后,您可以使用适当格式的CONVERT()。在这种情况下,我插入/以获取format 103. Find details here

DECLARE @stringdate VARCHAR(100)='30092016';
SELECT CONVERT(DATETIME,STUFF(STUFF(@stringdate,3,0,'/'),6,0,'/'),103)

编辑:使用SQL Server<如果没有STUFF(),您可以达到相同的目标。

SELECT CONVERT(DATETIME,LEFT(@stringdate,2)+'/'+SUBSTRING(@stringdate,3,2)+'/'+RIGHT(@stringdate,4),103)

更新

在你的评论中,你会问,table valued function如何做到这一点。尝试这样的事情:

CREATE FUNCTION dbo.CHECKS
( 
    @DateAsUnseparatedString_DDMMYYYY VARCHAR(8) 
)
RETURNS TABLE
AS
    RETURN
    SELECT 
        *
    FROM       
        TABLE1 t1
    INNER JOIN 
        TABLE2 t2 ON (1=1)
    WHERE 
        CAST(MYDATE AS DATE)=CONVERT(DATETIME,STUFF(STUFF(@DateAsUnseparatedString_DDMMYYYY,3,0,'/'),6,0,'/'),103);
GO

并称之为

SELECT * FROM dbo.CHECKS('26092016');

你没有得到任何回报

的原因

......很确定 - 你忘记了时间部分。像2016-08-08 10:27:58.0000000 这样的值不等于转换日期DDMMYYYY,如08082016。这就是为什么我使用CAST(... AS DATE)来获得一个日期,你可以将它与转换后的值进行比较,这也是一个赤裸的日期。

另一种方法是使用

WHERE MYDATE >= TheConvertedValue AND MYDATE < TheConvertedValue+1;