我在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';
你能帮我解决一下吗?
答案 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))