【问题标题】:Converting nvarchar to DATE将 nvarchar 转换为 DATE
【发布时间】:2016-02-09 15:29:38
【问题描述】:

我在 SQL 中有一个列,其中数据存储为 102915、060315 等。 该列的数据类型为nvarchar(50)。我想把上面的数据转换成日期格式。

它应该看起来像 10-29-15 或 10/29/15。

如何在 SQL Server Management Studio 2008 中转换以上内容?

尝试了很多东西:其中之一是

create view v1 
as
    Select 
        CAST([ISSUE] as date) as ISSUE,
        CAST([EXPIRE] as date) as EXPIRE
    from tablename

正在创建视图。

注意:ISSUE 和 EXPIRE 是具有 100515、060315 等值的列名,我需要将这些列中的所有值转换为 10-05-15 或 10/05/15。

当我执行select * from v1; 时,出现以下错误:

从字符串转换数据和/或时间时转换失败。

【问题讨论】:

  • 您尝试的方法不起作用?
  • 我尝试使用 cast 和 convert 但没有帮助我。
  • 也许您应该发布您的尝试,以便有人指出错误...
  • 请向我们展示您的尝试,并描述“没有帮助我”的样子。
  • 你没有提到目标(不,'我想格式化日期'不是你的实际目标)所以我的建议是转换为正确的数据类型。如果信息是日期,则将其转换为日期并让表示层定义格式。

标签: sql sql-server sql-server-2008 ssms


【解决方案1】:

你可以试试这个:

DECLARE @date VARCHAR(50) = '102915'

SELECT   CAST(  CAST( '20'+                  --prefix for the year 2000
                      SUBSTRING( @date,5,2)+ --year
                      SUBSTRING( @date,1,2)+ --month
                      SUBSTRING( @date,3,2)  --day
                 AS VARCHAR(10)) 
          AS DATE)

结果:

但这会假设您的日期都大于 1999 年。

由于您的日期格式是 MMddYY,因此很难获得正确的年份日期部分。

所以对于您的观点,您可以使用:

create view v1 as
    Select CAST(  CAST( '20'+                  --prefix for the year 2000
                          SUBSTRING( [ISSUE],5,2)+ --year
                          SUBSTRING( [ISSUE],1,2)+ --month
                          SUBSTRING( [ISSUE],3,2)  --day
                     AS VARCHAR(10)) 
              AS DATE) as ISSUE
          , 
        CAST(  CAST( '20'+                  --prefix for the year 2000
                          SUBSTRING( [EXPIRE],5,2)+ --year
                          SUBSTRING( [EXPIRE],1,2)+ --month
                          SUBSTRING( [EXPIRE],3,2)  --day
                     AS VARCHAR(10)) 
              AS DATE)  as EXPIRE
    from tablename

要获得 mm-dd-yyyy 格式的日期,您需要使用 CONVERT,您可以看到不同的转换 here:

create view v1 as
        Select convert(VARCHAR ,CAST( CAST( '20'+                  --prefix for the year 2000
                              SUBSTRING( [ISSUE],5,2)+ --year
                              SUBSTRING( [ISSUE],1,2)+ --month
                              SUBSTRING( [ISSUE],3,2)  --day
                         AS VARCHAR(10)) 
                   AS DATE), 110) as ISSUE
              , 
            convert(VARCHAR ,CAST(  CAST( '20'+                  --prefix for the year 2000
                              SUBSTRING( [EXPIRE],5,2)+ --year
                              SUBSTRING( [EXPIRE],1,2)+ --month
                              SUBSTRING( [EXPIRE],3,2)  --day
                         AS VARCHAR(10)) 
                   AS DATE), 110)  as EXPIRE
        from tablename

【讨论】:

  • 快到了。当我尝试将其设置为 MM-DD-YYYY 时,我收到与之前相同的错误。
  • CAST( CAST( SUBSTRING( [ISSUE],1,2)+ --month SUBSTRING( [ISSUE],3,2)+ --day '20'+ -- 年份前缀2000 SUBSTRING( [ISSUE],5,2) --year AS VARCHAR(10)) AS DATE) as ISSUE 这与您提供的相同,但只是更改了顺序才意识到日期数据类型的格式不接受!!!
  • 啊,我明白你在做什么了。你不能那样做。您需要做的是使用转换。我将更新我的答案,向您展示如何做到这一点。你可以通过投票来感谢我;)
  • @akshaybhat 好的,我现在添加了不同格式的解决方案。
  • 仍然没有给出 MM-DD-YYYY 的输出。我什至尝试使用代码 101 而不是 110,但没有成功!
【解决方案2】:

如果您使用的是 SQL Server 2012,则您拥有 DATEFROMPARTS 函数。它接受三个 int 参数 - 年、月和日 - 并返回一个日期。

使用 SQL Server 2008,您需要做更多类似的事情 -

Declare @Year as int=2012
Declare @Month as int=12
Declare @Day as int=31

Select Convert(Date,Convert(varchar(4), @Year)
+
Convert(varchar(2), @Month)
+
Convert(varchar(2), @Day))

(http://raresql.com/tag/sql-server-2012-date-and-time-function-datefromparts/)

您可以使用 SUBSTRING 拆分输入,例如

DECLARE @Year nvarchar(4) ='20' + SUBSTRING(InputField,1,2)

等等。结合这两种技术,您将获得一个可行的解决方案。

(顺便说一句 - 请不要以现有列的格式存储日期,这会为未来存储混乱。使用正确的数据类型,它会更好地工作。)

【讨论】:

  • 我将日期从大型机导入到 sql 服务器,因此它采用上述格式。
【解决方案3】:

这要简单得多:

select convert(nvarchar(50), convert(date, RIGHT('102915',2) + LEFT('102915',4), 112), 110)

分别:

create view v1 as
    Select 
        convert(nvarchar(50), convert(date, RIGHT([ISSUE],2) + LEFT([ISSUE],4), 112), 110) as ISSUE,
        convert(nvarchar(50), convert(date, RIGHT([EXPIRE],2) + LEFT([EXPIRE],4), 112), 110) as EXPIRE
    from tablename

【讨论】:

  • 好吧,您要求进行日期转换。我编辑以将日期输出为所需格式的字符串。
【解决方案4】:

你应该使用这个:

CONVERT(date, YOUR_DATE_FIELD, 1) AS DATE

有时,您无法像上面那样简单地进行转换,您需要使用 LEFT、SUBSTR 和 RIGHT 等函数。

类似这样的:

SELECT CONVERT(DATE, LEFT(field, 2) + SUBSTR(field, 2, 2) + RIGHT(field, 2), 1) AS DATE  

来源:https://msdn.microsoft.com/es-es/library/ms187928%28v=sql.120%29.aspx

【讨论】:

    猜你喜欢
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 2013-04-07
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    相关资源
    最近更新 更多