SQL Int к дате тогда на 1 год вперед? - PullRequest
2 голосов
/ 16 марта 2011

У меня есть столбец 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 ]

1 голос
/ 17 марта 2011
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
1 голос
/ 17 марта 2011

Подготовьте конечный месяц в том же формате, что и начальный месяц, затем примените преобразование, которое вы уже получили, к обоим:

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
1 голос
/ 16 марта 2011

Я бы посоветовал превратить их в даты, отсортировать логику и преобразовать их в строки.

В отличие от попыток сделать все это как строки.

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

(Работа со строками гораздо медленнее, чем работа с датами и целыми числами. Поэтому этот код может выглядеть немного длиннее, но при любом значительном количестве записей вы можете заметить заметную разницу в производительности.)

1 голос
/ 16 марта 2011
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 не идеальный инструмент для этого.

0 голосов
/ 16 марта 2011
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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...