假设我已经创建了一个表并插入数据,如下所示
create table datetimefromat
(
SlNo int identity,
datetimeVarchar varchar(100)
)
go
DECLARE @now datetime
SET @now = GETDATE()
insert into datetimefromat (datetimeVarchar)
values (convert(nvarchar(MAX), @now, 0)),
(convert(nvarchar(MAX), @now, 1)),
(convert(nvarchar(MAX), @now, 3)),
(convert(nvarchar(MAX), @now, 5)),
(convert(nvarchar(MAX), @now, 20)),
(convert(nvarchar(MAX), @now, 13)),
(convert(nvarchar(MAX), @now, 22)),
(convert(nvarchar(MAX), @now, 111));
go
select * from datetimefromat
go
+------+--------------------------+
| SlNo | datetimeVarchar |
+------+--------------------------+
| 1 | Mar 29 2016 12:46PM |
| 2 | 03/29/16 |
| 3 | 29/03/16 |
| 4 | 29-03-16 |
| 5 | 2016-03-29 12:46:32 |
| 6 | 29 Mar 2016 12:46:32:087 |
| 7 | 03/29/16 12:46:32 PM |
| 8 | 2016/03/29 |
+------+--------------------------+
我想将其转换回正常日期时间
select
*,
CONVERT(datetime, datetimeVarchar)
from datetimefromat
但这会导致错误
Msg 242,Level 16,State 3,Line 11
将varchar数据类型转换为日期时间数据类型会导致超出范围的值。
我该如何解决这个问题?
因为我想更新现有记录并将varchar
列更改为datetime
答案 0 :(得分:0)
两件事。首先,您需要在转换回日期时指定样式。其次,22不是有效的风格。
此代码有效:
CREATE TABLE datetimeformat
(SlNo INT IDENTITY,
datetimeVarchar VARCHAR(100),
datetimeFormat INT);
GO
DECLARE @now DATETIME = GETDATE();
INSERT INTO
datetimeformat (datetimeVarchar, datetimeFormat)
VALUES
(CONVERT(NVARCHAR(MAX), @now, 0), 0),
(CONVERT(NVARCHAR(MAX), @now, 1), 1),
(CONVERT(NVARCHAR(MAX), @now, 3), 3),
(CONVERT(NVARCHAR(MAX), @now, 5), 5),
(CONVERT(NVARCHAR(MAX), @now, 20), 20),
(CONVERT(NVARCHAR(MAX), @now, 13), 13),
-- (CONVERT(NVARCHAR(MAX), @now, 22), 22),
(CONVERT(NVARCHAR(MAX), @now, 111), 111);
GO
SELECT
*,
CONVERT(DATETIME, datetimeVarchar, datetimeFormat)
FROM
datetimeformat;
GO
答案 1 :(得分:0)
请尝试以下查询,这可能会对您有所帮助
select CAST((CASE WHEN isdate(datetimeVarchar) = 1 THEN datetimeVarchar
ELSE SUBSTRING(datetimeVarchar,4,3)+LEFT(datetimeVarchar,3)+RIGHT(datetimeVarchar,2)
END) AS DATETIME)
from datetimefromat
您可以使用函数isdate
检查给定值是否为有效日期,并根据结果标志构建您自己的逻辑(即else部分)。
SELECT (CASE WHEN ISDATE(datetimeVarchar) = 1 THEN CAST(datetimeVarchar AS DATETIME)
ELSE [*Use logic to convert/skip other string values here*] END )
from datetimefromat