我在存储过程代码中收到此错误,我发现其中一条记录来自闰年日期 2008 年 2 月 29 日。我如何使用我拥有的代码解决这个问题。这是代码:
set @ContractDate = cast(cast(@Year as nvarchar(4))
+ '/' + cast(datepart(mm,@ContractDate) as nvarchar(2))
+ '/' + cast(datepart(dd,@ContractDate) as nvarchar(2)) as datetime)
我在存储过程代码中收到此错误,我发现其中一条记录来自闰年日期 2008 年 2 月 29 日。我如何使用我拥有的代码解决这个问题。这是代码:
set @ContractDate = cast(cast(@Year as nvarchar(4))
+ '/' + cast(datepart(mm,@ContractDate) as nvarchar(2))
+ '/' + cast(datepart(dd,@ContractDate) as nvarchar(2)) as datetime)
首先:
我问是因为这在us_english
SQL Server 2012上对我有用
SELECT cast('2008/02/29' as datetime)
但是,如果我改变,SET DATEFORMAT
那么我可以打破上面的代码
-- breaks
SET DATEFORMAT DMY;
SELECT cast('2008/02/29' as datetime)
无论我使用什么 SET DATEFORMAT都可以使用 ISO 日期格式
SET DATEFORMAT DMY;
SELECT cast('20080229' as datetime);
SET DATEFORMAT MDY;
SELECT cast('20080229' as datetime);
SET DATEFORMAT YDM;
SELECT cast('20080229' as datetime);
结论:您使用的是非 ISO 日期格式并依赖于隐式转换
最好yyyymmdd
在转换为日期时间/日期之前以 ISO 格式 () 获取字符串,并且无论文化设置如何,它都可以在任何服务器上工作
如果@ContractDate
是一种datetime/date
类型并且@year
就像2012/'2012'
然后下面应该工作。工作示例
Set @ContractDate = convert(datetime,
convert(varchar(4),@year) + right(convert(varchar(8),@ContractDate,112),4))
ALTER PROCEDURE [dbo].[Sden_report1]
@fromdt nvarchar(13),
@todt nvarchar(13)
AS
BEGIN
select AD_PID,AD_Appointmentdate,AD_Patientname,AD_Patientphno,AD_Visitpurpose
from Appointment_Details1
where
--PL_CID = @CID and PL_Itemcode = @JCode AND
(@fromdt = '' OR (DATEDIFF(DAY,AD_Appointmentdate, @fromdt) <= 0))
AND (@todt = '' OR (DATEDIFF(DAY,AD_Appointmentdate, @todt) >= 0))
end
GO
When i Execute the procedure
i will get below error:
EXEC Sden_report1 '20-11-2012','20-05-2013'
Error
The conversion of a nvarchar data type to a datetime data type resulted in an out-of-range value.
Anyone Help...`enter code here`