SQL Int to Date然后提前1年?

时间:2011-03-16 16:36:33

标签: sql tsql

我有一个int列,存储日期如下:

201101
201102
201103

我需要接受这些int并将它们转换成这样的东西:

01/2011
02/2011
03/2011

但是在同一列中,我需要在该日期添加一年,因此我希望以下列与现有

相对应
201101 = 01/2011 - 12/2011
201102 = 02/2011 - 01/2012
201103 = 03/2011 - 02/2012

到目前为止我做了以下操作,使其成为日期字符串:

RIGHT(RTRIM([x].[Work_Month]),2) + '/' + LEFT([x].[Work_Month],4) AS PeriodDisplay

我只是不知道如何添加一年呢?

由于

5 个答案:

答案 0 :(得分:1)

DATEADD(yyyy,1,convert(date,RIGHT(RTRIM([x].[Work_Month]),2) + '/01/' + LEFT([x].[Work_Month],4) ))

我所做的改变:

  • 在/ 01 /中添加了/ - 以便将其设置为本月的第一天,否则您无法将其解析为日期
  • 将其包围在convert(date)函数中,将其转换为日期类型。 msdn
  • dateadd函数中将其包围,以添加一年。 msdn

如果您确实希望该列包含两个日期(因此该字符串将在字面上为03/2011 - 02/2012),那么只需从第一个日期中删除dateadd。如果你不想要这些日子,那么你可以使用子字符串去除它们。这确实是一个前端的事情:SQL Server不是这样做的理想工具。

答案 1 :(得分:1)

我的建议是将它们变成日期,对逻辑进行排序,将它们转换为字符串。

与尝试将其全部用作字符串相反。

SELECT
  DATEADD(
    MONTH,
    (work_month % 100) - 1),
    DATEADD(
      YEAR,
      (work_month / 100) - 2001,
      '2000-Jan-01'
    )
  )                           AS "Start",
  DATEADD(
    MONTH,
    (work_month % 100) - 1),
    DATEADD(
      YEAR,
      (work_month / 100) - 2000,
      '2000-Jan-01'
    )
  ) - 1                       AS "End",
FROM
  myTable

(使用字符串混乱比弄乱日期和整数要慢得多。所以这段代码可能看起来要长一些,但是在任何大量的记录中你都可能看到明显的性能差异。)

答案 2 :(得分:1)

以与开始月份相同的格式准备结束月份,然后将您已经获得的转化应用于两者:

SELECT
  RIGHT(RTRIM(x.WorkMonth1),2) + '/' + LEFT(x.WorkMonth1,4) + ' - ' +
  RIGHT(RTRIM(x.WorkMonth2),2) + '/' + LEFT(x.WorkMonth2,4) AS PeriodDisplay
FROM (
  SELECT
    WorkMonth1 = Work_Month,
    WorkMonth2 = Work_Month + CASE Work_Month % 100 WHEN 1 THEN 11 ELSE 99 END
  FROM atable
) x

答案 3 :(得分:1)

declare @T table (wm int)

insert into @T values
(201101),
(201102),
(201103)

select
 right(convert(char(10),dateadd(m,wm%100-1 ,dateadd(yy,wm/100-year(0),0)),103),7) as StartDate,
 right(convert(char(10),dateadd(m,wm%100+10,dateadd(yy,wm/100-year(0),0)),103),7) as EndDate
from @T

结果

StartDate EndDate
--------- -------
01/2011   12/2011
02/2011   01/2012
03/2011   02/2012

答案 4 :(得分:0)

Declare @SampleData Table   ( Value int not null )

Insert @SampleData(Value) Values(201101)
Insert @SampleData(Value) Values(201102)
Insert @SampleData(Value) Values(201103)

Select Cast( Cast(Value As char(6)) + '01' As datetime)
    , DateAdd(mm,11,Cast( Cast(Value As char(6)) + '01' As datetime))
From @SampleData

将值转换为日期后,您可以使用表示层将日期格式设置为MM/yyyy