如何将SQL中的任何格式的varchar转换为datetime

时间:2016-03-29 07:35:20

标签: sql sql-server sql-server-2008 datetime

假设我已经创建了一个表并插入数据,如下所示

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

2 个答案:

答案 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