我知道很多这样的问题已经在这里,但我的问题与已经存在的问题略有不同。
场景:数据库具有DateTime类型的ApptDt列,其值为“yyyy-mm-dd hh:mm:ss”。我来自印度,日期以欧洲格式传递,“dd-mm-yyyy”。因此,每次我收到此错误:
将Varchar数据类型转换为日期时间会导致超出范围值
示例查询1:
Declare @EffectiveDt as varchar(29)
Set @EffectiveDt = '27/07/2013'
print Convert(DateTime,@EffectiveDt,102) // throws above error
示例查询2:
Declare @EffectiveDt as varchar(29)
Set @EffectiveDt = '07/27/2013'
print Convert(DateTime,@EffectiveDt,104) // throws above error too
问题:
这两种格式有效,并且在T-Sql中允许转换;为什么会抛出这样的错误?
是否有任何通用函数或方案可以在SQL中保存此类来回转换?
答案 0 :(得分:1)
您应该首先使用d/m/y
或m/d/y
等区域格式 NOT 。如果你使用明确的字符串格式,如yyyymmdd
,那么永远不会有问题,你不必找到各种疯狂的解决方法。只需首先以清晰标准的方式格式化日期。
仅仅因为你来自印度并不意味着你必须使用区域字符串来表示日期。如果你让人们在自由文本中输入日期(这是我可以解释的唯一方式,你最终会在2013年7月27日,2013年7月27日和2013年7月27日),停止这样做,或者验证他们的输入。如果有人进入2013年6月6日,你怎么知道他们是在5月6日还是6月5日? SQL Server也说不出来,并且没有任何神奇的方法(比如在Access中)强制它进行猜测,如果数字无效则转置它们。这实际上是非常可怕的行为。
答案 1 :(得分:0)
答案 2 :(得分:0)
只需CAST
而不是在特定的文化中尝试CONVERT
:
SELECT CAST(@EffectiveDt AS DATETIME)