将varchar列转换为sql server中的datetime

时间:2015-04-21 15:16:20

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

我有一张包含以下定义和数据的表格。

定义:

CREATE TABLE [dbo].[TestTB]
(
    [CREATEDATE] [nvarchar](50) NULL
) ON [PRIMARY]

数据:

 10/9/2014 
 1/26/2015 
 2/16/2015 

当我运行查询时:

Select 
    CAST(CREATEDATE AS DATETIME) as CREATEDATE 
FROM 
    [dbo].[TestTB]

抛出错误:

  

Msg 241,Level 16,State 1,Line 1
  从字符串转换日期和/或时间时转换失败。

即使在运行

后,上述操作也无效
SET DATEFORMAT dmy

但是以下查询工作正常

  DECLARE @data nvarchar(50)
  SET @data =  ' 10/9/2014 '
  Select CAST(@data as DateTime)

以上查询返回:2014-10-09 00:00:00.000

如何将列中存储的日期字符串(mm / dd / yyyy格式)转换为日期时间?

4 个答案:

答案 0 :(得分:2)

首先,如果您的表格列是“日期时间”类型,那么无论您是否将其转换为日期,它都将以此格式“2014-10-09 00:00:00.000”保存数据。但如果不是这样,如果你有SQL Server 2008或更高版本,你就可以使用它,

DECLARE @data nvarchar(50)
SET @data =  '10/9/2014'

IF(ISDATE(@data)>0)
BEGIN
    SELECT CONVERT(DATE, @data)
END

否则

DECLARE @data nvarchar(50)
SET @data =  '10/9/2014'

IF(ISDATE(@data)>0)
BEGIN
    SELECT CONVERT(DATETIME, @data)
END

要插入表格

INSERT INTO dbo.YourTable
SELECT CREATEDATE FROM
(
    SELECT
        (CASE WHEN (ISDATE(@data) > 0) THEN CONVERT(DATE, CREATEDATE) 
        ELSE CONVERT(DATE, '01/01/1900') END) as CREATEDATE 
    FROM 
        [dbo].[TestTB]
) AS Temp
WHERE
    CREATEDATE <> CONVERT(DATE, '01/01/1900')

答案 1 :(得分:0)

DECLARE @data nvarchar(50)
  SET @data =  ' 10/9/2014 '
  SELECT CONVERT(datetime, @data, 101)

SELECT CONVERT(datetime, CREATEDATE, 101) as CREATEDATE 
FROM [dbo].[TestTB]

http://www.sqlfiddle.com/#!6/f2103

请查看此http://msdn.microsoft.com/en-us/library/aa226054%28SQL.80%29.aspx

答案 2 :(得分:0)

试试这个:

SELECT IIF(ISDATE(CREATEDATE) = 1, CONVERT(DATETIME, CREATEDATE, 110), CREATEDATE) as DT_CreateDate
FROM [dbo].[TestTB]

SQL Fiddle Solution

答案 3 :(得分:0)

nvarchar到datetime是一个隐式转换,这意味着你可以这样做:

declare @strDate nvarchar(50), @myDate datetime
set @strDate = '01/26/2013'
set @myDate = @strDate

但你的问题是日期格式,所以你必须转换它,但你必须指定格式或样式,你正在使用的样式的代码是101(根据this table)所以安全的方式:

 declare @strDate nvarchar(50), @myDate datetime
 set @strDate = '01/26/2013'
 set @myDate = CONVERT(DATETIME, @strDate, 101)

您可以跳过代码但使用不同的配置(服务器)代码将中断。 如果您使用ISO样式(yyyymmdd),您永远不必担心,转换将是隐含的:

  declare @strDate nvarchar(50), @myDate datetime
  set @strDate = '20150421' --ISO style (yyyymmdd)
  set @myDate = @strDate