0

我正在使用第 3 方数据库,该数据库(无论出于何种原因)内部以格式存储日期,yyyymm例如201212.Dec 2012INT

有没有一种简单的方法可以将其转换为 SQL ServerDateTime类型?

我已经尝试手动将上述转换为长度为 6 的字符序列,将其与 '01' 连接以获得给定月份的开始,如下所示:

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

然后将其包装在datetime转换中:

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

但这似乎扔了;

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

谁能阐明我做错了什么?

谢谢!:)

4

7 回答 7

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)

第一个很好,因为您不会有任何区域设置依赖性。第二个很好,因为它很简短。

于 2012-12-31T14:35:27.140 回答
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

于 2012-12-31T14:38:23.653 回答
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)
于 2012-12-31T14:50:56.850 回答
0

你可以使用如下:

Select CAST( CAST(datepart(year,getdate()) AS VARCHAR(4))+ CAST (datepart(MONTH,getdate()) as VARCHAR(2)) AS INT) as YYYYMM
于 2012-12-31T14:44:59.093 回答
0

这应该做的东西:

DECLARE @Period INTEGER = 201212 
SELECT  CAST( CAST( @Period * 100 + 1 AS CHAR(8) ) AS DATETIME )
于 2012-12-31T14:35:14.963 回答
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

SQL Fiddle 上的实时示例。

于 2012-12-31T14:38:33.593 回答
0

您可以通过一些简单的数学来做到这一点,尽可能避免使用字符串:

declare @Start int
set @Start = 201212

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

话虽这么说,我已经预料到你最初发布的内容,因为YYYYMMDD它是一种明确的格式。


如果您从可能包含一系列值的表中选择这些值,其中只有一些是这些值,并且您依赖该WHERE子句在转换发生之前过滤掉无效值,那么您就不走运了- SQL Server 有一个令人讨厌的移动操作的习惯,并且可以按照它喜欢的任何顺序应用过滤器和转换。

如果是这种情况,请将过滤步骤(以排除无效Period值)移动到填充表变量或临时表的单独查询中,然后在单独的查询中对这些值执行转换。

于 2012-12-31T14:40:17.527 回答