将nvarchar转换为DATE

时间:2016-02-09 15:29:39

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

我在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;时,我收到以下错误:

  

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

4 个答案:

答案 0 :(得分:2)

你可以试试这个:

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)

结果:

enter image description here

但是这将假设你的日期都大于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

答案 1 :(得分:0)

如果您使用的是SQL Server 2012,则可以使用DATEFROMPARTS函数。它需要三个int参数 - Year,Month和Day - 并返回一个日期。

使用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))

this answer

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

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

等。结合这两种技术,您就可以找到有效的解决方案。

(顺便说一下 - 请不要以现有列的格式存储日期,这样会对未来产生混淆。使用正确的数据类型会更好。)

答案 2 :(得分:0)

这更简单:

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

答案 3 :(得分:-1)

你应该用这个:

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