请有人帮我解决此错误。
表格结构:
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时出错。
请帮帮我。
由于
答案 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)
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;