T-SQL日期时间转换

时间:2012-12-31 14:32:14

标签: sql sql-server tsql

我正在使用第三方数据库,该数据库(无论出于何种原因)内部以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}}

但这似乎扔了;

  

从字符串

转换日期和/或时间时转换失败

任何人都可以解释我做错了什么吗?

谢谢! :)

7 个答案:

答案 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

Live example at SQL Fiddle.

答案 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)