Sql Datetime到varchar转换错误

Sql Datetime到varchar转换错误,sql,datetime,sql-server-2008-r2,Sql,Datetime,Sql Server 2008 R2,我知道这里已经有很多这样的问题了,但我的问题与已经存在的问题略有不同 场景:数据库具有DateTime类型的ApptDt列,其值的格式为“yyyy-mm-dd hh:mm:ss”。我来自印度,日期以欧洲格式“dd-mm-yyyy”传递。所以每次我遇到这个错误: 将Varchar数据类型转换为datetime会导致值超出范围 示例查询1: Declare @EffectiveDt as varchar(29) Set @EffectiveDt = '27/07/2013' print

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

场景:数据库具有DateTime类型的ApptDt列,其值的格式为“yyyy-mm-dd hh:mm:ss”。我来自印度,日期以欧洲格式“dd-mm-yyyy”传递。所以每次我遇到这个错误:

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

示例查询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内部是否存在任何通用函数或场景来保存这种往返转换


  • 102
    更改为
    104
    (德语格式)


    只是
    铸造它,而不是尝试在非常特定的文化中转换它:

    SELECT CAST(@EffectiveDt AS DATETIME)
    

    首先,你应该做的是不要使用像
    d/m/y
    m/d/y
    这样的区域格式。如果您使用像
    yyyyymmdd
    这样明确的字符串格式,那么就不会有问题,您也不必找到各种疯狂的解决方法。首先,用一种清晰和标准的方式安排你的日期


    仅仅因为您来自印度并不意味着您必须使用区域字符串来表示日期。如果你让人们在自由文本中输入日期(这是我唯一能解释你以2013年7月27日、2013年7月27日和2013年7月27日结束的方式),停止这样做,或者验证他们的输入。如果有人进入2013年6月5日,你怎么知道他们指的是5月6日还是6月5日?SQL Server也无法分辨,也没有神奇的方法(如Access中的方法)强迫它猜测,并在数字无效时转换数字。这实际上是非常可怕的行为。

    CONVERT
    应该用于从
    datetime
    转换为各种
    char/varchar
    格式。CONVERT的第二个参数必须是datetime类型。@cars10 AFAIK CONVERT()在SQL Server中将一种数据类型的表达式转换为另一种数据类型。另外,作为旁注,dd mm YYY和dd/mm/yyyy不相同,并且datetime列没有任何“格式”-您所说的格式是Management Studio向您显示数据的方式,但这不是它的内部存储方式。如果你已经阅读了许多问题/评论/答案,你应该已经看到很多人指出,
    datetime
    列没有格式(正如我现在注意到Aaron在这里也指出的),如果可能的话,首先避免将日期放在字符串中-您从何处接收此字符串?感谢您的解决方案奏效。如果我是对的,那么Convert(DateTime,@EffectiveDt,104)需要德语格式的@EffectiveDate。。或者,这意味着您需要指定格式102、103或104的类型,它将转换为SQL日期时间格式。转换不能用于切换格式。。。AmitRanjan:没有通用的自动转换功能。因此,您应该将
    DateTime
    存储为
    DateTime
    ,并在将它们传递到数据库之前将其转换为
    DateTime
    CAST
    函数被转换为
    convert
    。此外,对于
    CAST
    ,无法定义转换样式。
    SELECT CAST(@EffectiveDt AS DATETIME)