我试图运行一个查询,我将转换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)
当从字符串转换日期和/或时间时,我不断收到转换失败的原因。在此先感谢您的帮助
答案 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
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