日期时间到varchar转换错误

时间:2013-07-30 14:12:51

标签: sql datetime sql-server-2008-r2

我知道很多这样的问题已经在这里,但我的问题与已经存在的问题略有不同。

场景:数据库具有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

问题:

  1. 这两种格式有效,并且在T-Sql中允许转换;为什么会抛出这样的错误?

  2. 是否有任何通用函数或方案可以在SQL中保存此类来回转换?

3 个答案:

答案 0 :(得分:1)

您应该首先使用d/m/ym/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)

102更改为104(德语格式)

SELECT Convert(DateTime,@EffectiveDt,104)  

Demo

答案 2 :(得分:0)

只需CAST而不是在特定的文化中尝试CONVERT

SELECT CAST(@EffectiveDt AS DATETIME)