T-SQL日期时间转换(T-SQL datetime conversion)

2019-08-05 04:01发布

我与第三方数据库,其工作(无论何种原因)内部存储格式的日期yyyymm例如, 201212Dec 2012INT

有一个简单的办法,我可以将此转换为SQL Server的DateTime类型?

我已经试过手动转换上面长度为6的字符序列,“01”这个串联得到一个特定的月份,像这样的开头:

(CONVERT(char(6), Period) + '01')`

然后在包装这个datetime的转换:

CONVERT(datetime, (CONVERT(char(6), Period) + '01'))

但这似乎扔;

转化率从字符串转换日期和/或时间时失败

任何人都可以阐明我做错了任何光线?

谢谢! :)

Answer 1:

您需要使用正确的参数。 这里的MSDN图表http://msdn.microsoft.com/en-us/library/ms187928.aspx

在你的情况,我相信你需要追加“01”,并使用此

declare @val VARCHAR(8)

SET @val = '201212'

set @val = @val + '01'

print CONVERT(DATETIME, @val, 12)

图12是ISO格式,将采取任一或YYMMDD YYYYMMDD



Answer 2:

这是做这件事:

Declare @val as int = 20121231;
select DATEADD (YEAR,@val/10000-1900,DATEADD(MONTH,(@val%10000)/100-1,DATEADD(DAY,@val%100-1,0 )))

这是另一种:

Declare @val as int = 20121231;
    Cast(Cast(@val as char(8)) as date)

首先是一件好事,因为你不会有任何区域设置的依赖关系。 第二个是好的,因为它是短暂的。



Answer 3:

转换为整数yyyy-mm-dd风格的字符串:

select  convert(datetime, 
            left(cast(dt as char(6)),4) + '-' +
            right(cast(dt as char(6)),2) + '-01',
            121) -- 121 = ODBC = yyyy-mm-dd hh:mi:ss.mmm (24h)
from    YourTable

在SQL小提琴活生生的例子。



Answer 4:

你可以按照以下用途:

Select CAST( CAST(datepart(year,getdate()) AS VARCHAR(4))+ CAST (datepart(MONTH,getdate()) as VARCHAR(2)) AS INT) as YYYYMM


Answer 5:

这应该做的东西:

DECLARE @Period INTEGER = 201212 
SELECT  CAST( CAST( @Period * 100 + 1 AS CHAR(8) ) AS DATETIME )


Answer 6:

你可以用一些简单的数学做,避免了串尽可能:

declare @Start int
set @Start = 201212

select DATEADD(month,((@Start/100)-1970)*12 + (@Start%100-1),'19700101')

话虽这么说,我会期待你最初发布什么去上班,因为YYYYMMDD是一个明确的格式。


如果你从表中选择这些值可能包含一个值的范围,只有其中一些是这些值,而你依靠WHERE转换发生前子句来过滤掉无效的,你出来的运气 - SQL Server有走动操作的坏习惯,并可以在任何它喜欢的顺序应用过滤器和转换。

如果是这样的情况下,将过滤步骤(排除无效Period值)转换成用于填充表变量或临时表一个单独的查询,然后在一个单独的查询执行这些值的转换。



Answer 7:

我发现工作得很好以下。 假设你的INT的日期是YYYYMM格式。 首先乘以100,再加入1(这导致在INT与01 DD),所以你现在已经年月日,而不是YYYYMM。 然后铸造DATETIME之前转换为CHAR(8)。 希望对你有效。

DECLARE @SourceDT   INT = 201212
SELECT CAST( CAST((@SourceDT * 100) + 1 AS CHAR(8)) AS DATETIME)


文章来源: T-SQL datetime conversion