我(不幸的是)有一些保存在varchar列中的日期。这些列包含以下格式的日期:
MMDDYY
例如:
010110
我需要将这些值导入到一个设置为datetime的表中,并将日期格式化为:
2010-09-17 00:00:00.000
如何将上面的字符串转换为下面的日期时间值?
答案 0 :(得分:8)
CAST功能会执行此操作,问题是它会假设您前两位数是年份。这应该适合你:
SELECT CAST((RIGHT('010110',2) + LEFT('010110',4)) AS DATETIME)
这假设所有日期都是MMDDYY。
答案 1 :(得分:5)
这是一个解决方案
SELECT CAST(SUBSTRING(@date, 5, 2) + SUBSTRING(@date, 1, 4) AS DATETIME)
答案 2 :(得分:3)
将字符串转换为YYMMDD格式,您应该处于良好状态:
declare @x varchar(6)
set @x = '091710'
declare @d datetime
set @d = cast(RIGHT(@x,2) + LEFT(@x,4) as datetime)
select @d
答案 3 :(得分:2)
使用子字符串将相关部分抓取为'yyyy-mm-dd'格式,然后将cast
格式化为日期时间:
cast(
'20' + substring(col1,5,2) + '-' +
substring(col1,1,2) + '-' +
substring(col1,3,2)
as datetime)
答案 4 :(得分:2)
MSDN中描述了支持的日期转换样式。坏消息是mmddyy
没有风格。因此,您必须进行自定义格式化。如何完成取决于您的导入方式。它是SSIS ETL的一步吗?它是一次性表副本吗?
您可以直接从T-SQL自定义转换指定的格式:
declare @x varchar(6) = '010110';
select dateadd(month, cast(substring(@x, 1,2) as int)-1,
dateadd(day, cast(substring(@x,3,2) as int)-1,
dateadd(year, cast(substring(@x,5,2) as int),'01-01-2000')));
答案 5 :(得分:1)
尝试这样的事情:
DECLARE @OldTable table (col1 int, col2 char(1), col3 char(6))
DECLARE @NewTable table (col1 int, col2 char(1), col3 datetime)
INSERT @OldTable VALUES (1,'A','010110') --mmddyy = jan 1, 2010
INSERT @OldTable VALUES (1,'A','091710') --mmddyy = sep 17, 2010
INSERT INTO @NewTable
(col1, col2, col3)
SELECT
col1, col2, RIGHT(col3,2) + LEFT(col3,4) --<< cast to datetime not needed...
FROM @OldTable --<< because @NewTable.col3 is datetime
ORDER BY Col1
SELECT * FROM @NewTable
输出:
col1 col2 col3
----------- ---- -----------------------
1 A 2010-01-01 00:00:00.000
1 A 2010-09-17 00:00:00.000
(2 row(s) affected)
答案 6 :(得分:0)
这适用于varchar
字符串长6个字符
CAST((RIGHT('130513',2) + ltrim(rtrim(right(left('130513', 4), 2))) + LEFT('130513',2) ) AS DATETIME)
这会将字符串转换为 2013年5月13日