我正在使用第三方数据库,该数据库(无论出于何种原因)内部以yyyymm
格式存储日期,例如201212
Dec 2012
INT
DateTime
是否有一种简单的方法可以将其转换为SQL Server (CONVERT(char(6), Period) + '01')`
类型?
我尝试手动将上面的内容转换为长度为6的char seq,将其与'01'连接以获得给定月份的开头,如下所示:
datetime
然后将其包装在CONVERT(datetime, (CONVERT(char(6), Period) + '01'))
转化中:
{{1}}
但这似乎扔了;
从字符串
转换日期和/或时间时转换失败
任何人都可以解释我做错了什么吗?
谢谢! :)
答案 0 :(得分:1)
这是一种方法:
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)
第一个很好,因为您不会有任何区域设置依赖项。第二个是好的,因为它很简短。
答案 1 :(得分: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
答案 2 :(得分:0)
这应该做的事情:
DECLARE @Period INTEGER = 201212
SELECT CAST( CAST( @Period * 100 + 1 AS CHAR(8) ) AS DATETIME )
答案 3 :(得分:0)
将整数转换为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
答案 4 :(得分:0)
你可以用一些简单的数学来做,尽可能避免使用字符串:
declare @Start int
set @Start = 201212
select DATEADD(month,((@Start/100)-1970)*12 + (@Start%100-1),'19700101')
话虽如此,我已经预料到您最初发布的内容,因为YYYYMMDD
是一种明确的格式。
如果您从可能包含一系列值的表中选择这些值,其中只有一些是这些值,并且您依赖于WHERE
子句来过滤掉无效值在转换发生之前,你运气不好 - SQL Server有一个讨厌的习惯,即可以按照自己喜欢的顺序应用过滤器和转换。
如果是这种情况,请将过滤步骤(以排除无效的Period
值)移动到填充表变量或临时表的单独查询中,然后在单独的查询中对这些值执行转换。 / p>
答案 5 :(得分:0)
您可以使用如下:
Select CAST( CAST(datepart(year,getdate()) AS VARCHAR(4))+ CAST (datepart(MONTH,getdate()) as VARCHAR(2)) AS INT) as YYYYMM
答案 6 :(得分:0)
我发现以下内容非常有效。 假设您的日期的INT是YYYYMM格式。 首先乘以100,然后加1(这导致一个带有DD为01的INT),所以你现在有YYYYMMDD而不是YYYYMM。 然后在转换为DATETIME之前强制转换为CHAR(8)。 希望它适合你。
DECLARE @SourceDT INT = 201212
SELECT CAST( CAST((@SourceDT * 100) + 1 AS CHAR(8)) AS DATETIME)