我与第三方数据库,其工作(无论何种原因)内部存储格式的日期yyyymm
例如, 201212
为Dec 2012
为INT
。
有一个简单的办法,我可以将此转换为SQL Server的DateTime
类型?
我已经试过手动转换上面长度为6的字符序列,“01”这个串联得到一个特定的月份,像这样的开头:
(CONVERT(char(6), Period) + '01')`
然后在包装这个datetime
的转换:
CONVERT(datetime, (CONVERT(char(6), Period) + '01'))
但这似乎扔;
转化率从字符串转换日期和/或时间时失败
任何人都可以阐明我做错了任何光线?
谢谢! :)
您需要使用正确的参数。 这里的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
这是做这件事:
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)
首先是一件好事,因为你不会有任何区域设置的依赖关系。 第二个是好的,因为它是短暂的。
转换为整数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小提琴活生生的例子。
你可以按照以下用途:
Select CAST( CAST(datepart(year,getdate()) AS VARCHAR(4))+ CAST (datepart(MONTH,getdate()) as VARCHAR(2)) AS INT) as YYYYMM
这应该做的东西:
DECLARE @Period INTEGER = 201212
SELECT CAST( CAST( @Period * 100 + 1 AS CHAR(8) ) AS DATETIME )
你可以用一些简单的数学做,避免了串尽可能:
declare @Start int
set @Start = 201212
select DATEADD(month,((@Start/100)-1970)*12 + (@Start%100-1),'19700101')
话虽这么说,我会期待你最初发布什么去上班,因为YYYYMMDD
是一个明确的格式。
如果你从表中选择这些值可能包含一个值的范围,只有其中一些是这些值,而你依靠WHERE
转换发生前子句来过滤掉无效的,你出来的运气 - SQL Server有走动操作的坏习惯,并可以在任何它喜欢的顺序应用过滤器和转换。
如果是这样的情况下,将过滤步骤(排除无效Period
值)转换成用于填充表变量或临时表一个单独的查询,然后在一个单独的查询执行这些值的转换。
我发现工作得很好以下。 假设你的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)