0

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

场景:数据库具有 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 中进行这种往返转换?

4

3 回答 3

2

您应该做的不是首先使用区域格式,例如d/m/ym/d/y。如果您使用明确的字符串格式,yyyymmdd那么永远不会有问题,您不必找到各种疯狂的解决方法。只需首先以清晰和标准的方式格式化您的日期。

仅仅因为您来自印度并不意味着您必须使用区域字符串来表示日期。如果您让人们以自由文本形式输入日期(这是我可以解释您最终以 07/27/2013、27/07/2013 和 27-07-2013 结束的唯一方法),请停止这样做,或验证他们的输入。如果有人输入 05/06/2013,你怎么知道他们是指 5 月 6 日还是 6 月 5 日?SQL Server 也无法判断,并且没有神奇的方法(就像 Access 中的那样)强制它猜测,如果数字无效则转置数字。这实际上是非常可怕的行为。

于 2013-07-30T14:23:29.660 回答
0

更改102104(德语格式)

SELECT Convert(DateTime,@EffectiveDt,104)  

演示

于 2013-07-30T14:15:48.223 回答
0

只是它而不是在一个非常特定的文化CAST中尝试它:CONVERT

SELECT CAST(@EffectiveDt AS DATETIME)
于 2013-07-30T14:15:55.760 回答