此查询的SQL中的转换失败错误

时间:2018-04-17 17:31:45

标签: sql-server

我在stackoverflow中检查了这个错误,但我的情况和错误是不同的。请不要将其重复。

我收到以下错误

  

从SQL

中的字符串转换日期和/或时间时

我的存储过程中有以下查询。 work_completion_date_inst列类型为date,它将日期存储为以下格式。我使用的是SQL Server 2008。

yyyy-mm-dd 
2018-04-03
2018-04-03
2018-04-14
2018-04-13

CREATE PROCEDURE [dbo].[test]
    (@P_USER_ID INT,
     @P_START_DATE DATETIME,
     @P_END_DATE DATETIME)
AS
BEGIN
    SELECT name 
    FROM table1 
    WHERE work_completion_date_inst BETWEEN @P_START_DATE AND @P_END_DATE 
      AND user = @P_USER_ID;
END;

我将以下日期传递给存储过程:

P_START_DATE = 01/04/2018
P_END_DATE =  16/04/2018

当它从服务器传递时,在存储过程中,它以'01/04/2018 00:00:00' and '16/04/2018 00:00:00'

的形式到达

所以我得到了#34;转换失败错误"。

如果我将日期传递给小于或等于12,则查询有效。只要它高于12,就会弹出此错误。

例如:

select name 
from table1 
where work_completion_date_inst BETWEEN '01/04/2018 00:00:00' and '12/04/2018 00:00:00'; 

你能帮我解决一下吗?

1 个答案:

答案 0 :(得分:5)

SQL Server将该日解析为月份,因此转换错误。即它将其视为MM / DD / YYY。将其作为ANSI标准,YYYYMMDD传递并防止这种情况发生,或执行其他操作,例如使用正确的样式使用CONVERT(),调整LANGUAGE设置或为事务设置DATEFORMAT 。这与语言设置有关。来自Aaron Bertrand的Read more here关于这个问题。

select name 
from table1 
WHERE work_completion_date_inst BETWEEN '20180401' and '20180404';

要在评论中按照您的要求进行转换,您可以使用以下两种方法之一:

declare @date date = '20180416'

--SQL Server 2012 onward...
select format(@date,'yyyy-dd-MM')

--Previous versions
select stuff(stuff(@date,5,3,right(@date,3)),9,2,left(right(@date,5),2))