【问题标题】:Varchar to datetime conversion in SQL Server 2008SQL Server 2008 中的 Varchar 到日期时间的转换
【发布时间】:2016-05-11 06:25:16
【问题描述】:

我需要将 varchar 转换为日期时间。我尝试过类似以下的方法

 declare @datevarchar(150)='01/10/15' 
 declare @datenew date

 select 
     @datenew = convert(smalldatetime, CONVERT(nvarchar(10), CAST(@date AS DATETIME), 101)  ,101)

print @datenew

输出是:2015-01-10

但是当我将日期更改为

 declare @date  varchar(150)='13/10/15' 

它会抛出以下错误:

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

日期时间的结果格式为 YYYY-MM-DD。我想要 DD-MM-YYYY 格式的结果..

我该怎么办?

提前致谢

【问题讨论】:

  • 只需将变量定义为2015-01-10。使用标准的日期格式,您的问题就会迎刃而解。
  • 如果您在此处查看代码 101 msdn.microsoft.com/en-AU/library/ms187928.aspx,您会看到它需要 m/d/y 格式(并且 13 不是一个月)。你能退后一步解释一下你真正想要做什么吗?为什么你关心日期的格式是什么?这取决于您当时碰巧使用的任何客户端工具。
  • 始终坚持标准的 YYYY-MM-DD 格式。 (如果您出于某种原因想要以其他格式显示,请尽可能晚地进行转换。)

标签: sql sql-server-2008 datetime type-conversion varchar


【解决方案1】:
   SET DATEFORMAT dmy; --ADD this command
   DECLARE @date as date  = '13/10/15'; --CHANGE the type to date
   declare @datenew date

 select 
        @datenew = convert(smalldatetime, CONVERT(nvarchar(10), CAST(@date AS DATETIME), 101)  ,101)

   print @datenew

【讨论】:

    【解决方案2】:

    适合dd/MM/yyyy 字符串表示的convert 样式是103, 而 101 样式适合 MM/dd/yyyy
    这一点,再加上 01 是有效日期和有效月份,而 13 只是有效日期这一事实,是您第一次转换成功而最后一次失败的原因。

    因此,如果您有一个表示日期的字符串,格式为dd/MM/yyyy,则可以将其转换为如下日期:

    DECLARE @Datestring char(10) = '13/09/2016' -- See note #1
    
    SELECT CONVERT(Date, @DateString, 103) 
    

    结果将是表示 2016 年 9 月 13 日的日期值。

    注意事项:
    #1 - 没有必要使用nvarchar(150) 来表示一个固定长度的字符串,它的所有字符都是ascii 兼容的。这就是为什么我的字符串是char(10)

    #2 - 正如我在 cmets 中所写 - 结果是日期数据类型,因此它是 have no display format. 如果您正在寻找显示格式,那么您需要一个表示日期值的字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 2019-08-03
      相关资源
      最近更新 更多