我有一张包含以下定义和数据的表格。
定义:
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格式)转换为日期时间?
答案 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]
答案 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