转换失败(从字符串转换日期和/或时间)

时间:2014-09-08 20:24:49

标签: sql sql-server converter

我试图运行一个查询,我将转换varchar列(TERM)转换为ddmmmyyyy格式的日期到正确的日期列(DATE),但我一直遇到错误。这是我正在运行的代码:

Update TABLE
set DATE = CAST(  CAST(DATEPART(YEAR, TERM) AS VARCHAR(4))  + '-'
    + CAST(DATEPART(MONTH, TERM)  AS VARCHAR(2))+ '-'
    + CAST(DATEPART(DAY, TERM)  AS VARCHAR(2)) AS DATE) 

当从字符串转换日期和/或时间时,我不断收到转换失败的原因。在此先感谢您的帮助

3 个答案:

答案 0 :(得分:3)

如果源数据是字符串,请不要使用DATEPART - 使用SUBSTRING

Update TABLE
set DATE = CAST(
      SUBSTRING(TERM,1,2) + '-'
    + SUBSTRING(TERM,3,3) + '-'
    + SUBSTRING(TERM,6,4)
           AS DATE) 

答案 1 :(得分:1)

您无法在字符串上运行datepart。这是日期功能。你想要这样的东西:

Update TABLE
    set DATE = CONVERT(date,
                       (LEFT(TERM, 4) + ' ' +
                        SUBSTRING(TERM, 3, 3) + ' ' +
                        RIGHT(TERM, 4)
                       ), 106
                      );

答案 2 :(得分:0)

您需要将类型转换与转换成功的测试结合起来,例如使用ISDATE()如果参数可以评估为日期则返回1.

测试数据

DECLARE @TABLE TABLE(String_Date VARCHAR(9), Real_Date DATE)

INSERT INTO @TABLE 
  (String_Date)
VALUES 
   ('31DEC2013')
  ,('26NOV2013')
  ,('22SEP2013')
  ,('31DEC2013')
  ,('31DEC2013')
  ,('rubbish')

查询

UPDATE @TABLE
SET Real_Date =  CASE WHEN ISDATE(String_Date) = 1 THEN CAST( String_Date AS DATE) END
FROM @TABLE

SELECT * FROM @TABLE
;

结果

| STRING_DATE |  REAL_DATE |
|-------------|------------|
|   31DEC2013 | 2013-12-31 |
|   26NOV2013 | 2013-11-26 |
|   22SEP2013 | 2013-09-22 |
|   31DEC2013 | 2013-12-31 |
|   31DEC2013 | 2013-12-31 |
|     rubbish |     (null) |

DATEPART( datepart, date)可用于字符串:

  

date是一个可以解析为时间,日期的表达式   smalldatetime,datetime,datetime2或datetimeoffset值。日期可以   是表达式,列表达式,用户定义变量或字符串   字面

使用DATEPART

可以获得相同的结果

查询b

UPDATE @TABLE
SET Real_Date =  CASE WHEN ISDATE(String_Date) = 1 THEN
                       CAST(  CAST(DATEPART(YEAR, String_Date) AS VARCHAR(4))  
                            + RIGHT('0' + CAST(DATEPART(MONTH, String_Date)  AS VARCHAR(2)) ,2)
                            + RIGHT('0' + CAST(DATEPART(DAY, String_Date)  AS VARCHAR(2)) ,2) AS DATE) 
                 END
FROM @TABLE

SELECT * FROM @TABLE