Sql server “错误”;将varchar数据类型转换为datetime数据类型导致值超出范围。”;而存储日期格式为dd-mm-yyyy

Sql server “错误”;将varchar数据类型转换为datetime数据类型导致值超出范围。”;而存储日期格式为dd-mm-yyyy,sql-server,Sql Server,如何在SQL Server中解决此错误: 将varchar数据类型转换为datetime数据类型导致值超出范围 我的问题是: Insert into Pedido (FechaPedido, FechaTipoPedido) Values('13-03-2018', '13-03-2018') 将字符串转换为指示其格式的日期 Insert into Pedido (FechaPedido, FechaTipoPedido) Values(convert(date, '13-03-2018'

如何在SQL Server中解决此错误:

将varchar数据类型转换为datetime数据类型导致值超出范围

我的问题是:

Insert into Pedido (FechaPedido, FechaTipoPedido) 
Values('13-03-2018', '13-03-2018')

将字符串转换为指示其格式的日期

Insert into Pedido (FechaPedido, FechaTipoPedido) 
Values(convert(date, '13-03-2018', 105), convert(date, '13-03-2018', 105))

具体地说,您使用的是105格式:

105是代码放置此代码并使用102103和不同类型的getdate


选择convert(varchar(20),getdate(),105)
尝试以“预期的”SQL日期格式插入它们

INSERT INTO Pedido (FechaPedido, FechaTipoPedido) VALUES ('20180313', '20180313')

不要使用不确定的日期格式。使用
yyyyMMdd
插入Pedido(FechaPedido,FechaTipoPedido)值('20180313','20180313')这避免了诸如语言之类的问题,其中2018年3月13日可以解释为第3个月的第13天或第13个月的第3天(不存在)。格式没有日期,它们是二进制值。有几十个重复的问题。答案总是一样的。不要使用字符串从客户端传递数据,使用带有强类型参数的参数化查询。如果必须使用字符串,例如在特殊查询中,请使用明确的日期文字。只有两种格式,未分离的日期格式为
YYYYMMDD
,日期时间格式为完整的ISO8601,即
YYYY-MM-DDTHH:MM:ss
在这种情况下,您试图向配置了US的服务器插入13个月locale@Larnu,谢谢你的重播。但存储日期格式的要求如上所述。SQL Server不以特定格式存储日期。它将日期存储为日期;您可以在表示层中进行格式设置。无论您最初如何传递日期(例如
dd-MM-yyyy
MM/dd/yyyy
yyyyymdd
),数据都将以相同的方式存储;提供给隐式转换成功。如果需要以特定的方式显示格式,可以在表示层中设置该格式;不在数据引擎中。“标准”SQL日期格式是
yyyyMMdd
而不是
yyyy-MM-dd
;后者是SSM的默认显示格式。如果您使用的是
datetime
,而不是
date
,则
选择CONVERT(datetime,'2018-03-13)可能会失败;无论您的语言设置如何。这就是为什么您应该始终使用
yyyyMMdd
yyyy-MM-ddThh:MM:ss.sss
@Larnu我同意您的观点,最好明确定义日期格式。然而,为了这个问题,我认为使用我提出的格式是可以的。顺便说一句,您提到的命令不会失败:
selectconvert(datetime,'2018-03-13')(你缺少一个引号-如果这是给你一个错误的话)。我只是错过了结尾
关<代码>选择转换(日期时间,'2018-03-13')仍然显示错误
将varchar数据类型转换为datetime数据类型导致值超出范围。
。这是因为SQL Server将
13
以及月份和
03
解释为天(至少在使用英国语言时是这样)。格式(
yyyy-MM-dd
)并不明确,因此为什么
'20180313'
yyyyymmdd
)是更好的格式。@Larnu虽然我没有得到错误,但您说服我(
yyyyMMdd
)是更好的格式:P。我现在编辑了答案以反映这一点。