Вопрос по sql, sql-server – Как разбить дату на месяц

1

Использование SQL Server 2000

Я хочу сохранить детали в месяц

Вход пользователя

ID = 001
Fromdate = 01/01/2012
Todate = 29/03/2012

ID = 002
Fromdate = 01/05/2012
Todate = 19/06/2012

ID = 003
Fromdate = 01/04/2012
Todate = 30/04/2012
.....

Из пользовательской записи я хочу вставить подробности в таблицу1 с условием типа fromdate и todate, разбитым на месячные (мм / гггг)

Ожидаемый результат

ID period fromdate todate

001 01/2012 01/01/2012 31/01/2012
001 02/2012 01/02/2012 29/02/2012
001 03/2012 01/03/2012 29/03/2012
002 05/2012 01/05/2012 31/05/2012
002 05/2012 01/06/2012 19/06/2012
003 04/2012 01/04/2012 30/04/2012
....
....

от даты, до датыdd/mm/yyyy формат периодаmm/yyyy

Как это сделать на сервере SQL.

Нужна помощь sql Query

Вы можете получить месяц с MONTH (fromdate) и год с YEAR (fromdate), но что вы уже пробовали? Я ожидаю, что вы должны написать процедуру или табличную функцию для этого. YvesR
ЯвляетсяFromdate всегда первый день месяца? Может ли это быть (как в & # x2018; должно быть разрешено быть & # x2019;) другим днем? Andriy M
нет, это изменится ... JetJack
Можете ли вы объяснить лучше. Хотите сохранить детали в таблице и запросить из таблицы? Muthukumar

Ваш Ответ

2   ответа
1

Во-первых, создать и заполнитьстол календаря который имеет следующие столбцы (по крайней мере):

CREATE TABLE dbo.Calendar (
    BaseDate datetime NOT NULL PRIMARY KEY,
    Period char(7) NOT NULL,
    YearNumber int NOT NULL,
    MonthNumber int NOT NULL,
    IsFirstDayOfMonth bit NOT NULL,
    IsLastDayOfMonth bit NOT NULL
)

Затем этот запрос вернет необходимые данные для одной парыfromdate а такжеtodate но вы, конечно, можете поместить ее в хранимую процедуру и вызывать ее один раз для каждого пользовательского ввода или любым другим способом, которым вы выполняете SQL из своего приложения:

declare @ID char(3), @FromDate datetime, @ToDate datetime

select @ID ='001', @FromDate = '20120107', @ToDate = '20120917'

select
    @ID as 'ID',
    c.Period,
    case when c.IsFirstDayOfMonth = 0x0 then @FromDate else c.BaseDate end as 'FromDate',
    case when @ToDate < c1.BaseDate then @ToDate else c1.BaseDate end as 'ToDate'
from
    dbo.Calendar c
    join dbo.Calendar c1
    on c.YearNumber = c1.YearNumber and c.MonthNumber = c1.MonthNumber
where
    c.BaseDate between @FromDate and @ToDate and
    (c.IsFirstDayOfMonth = 0x1 or c.BaseDate = @FromDate) and
    c1.IsLastDayOfMonth = 0x1
Какие данные мне нужно ввести в таблицу календаря ...?, Я выполняю ваш запрос, нет ошибок, а также нет выходных данных .... JetJack
спасибо за ваше объяснение, можете ли вы показать мне один пример .. JetJack
@JetJack Вы заполняете таблицу любым диапазоном дат и набором столбцов. Вы можете увидеть полный примерhere хотя лично вы должны решить, какие столбцы имеют смысл для ваших запросов. В будущем легко добавить больше столбцов, так что не думайте, что вы должны сделать это правильно с первого раза. Если вы создадите таблицу, которую я опишу, и заполните ее соответствующим образом, тогда запрос будет работать.
@JetJack Я показал вам один пример в статье, на которую я ссылался. Вы задали много вопросов об обработке и форматировании даты на основе той же таблицы и набора данных и получили много полезных ответов. Но вы все еще задаете вопросы, которые, на мой взгляд, довольно похожи. Я не хочу быть резким или бесполезным, но, пожалуйста, найдите время, чтобы прочитать и понять все ответы, всю соответствующую документацию и все ссылки, которые предоставили люди. Тогда ваше более глубокое понимание позволит вам задавать более точные вопросы, которые, в свою очередь, дают лучшие ответы.
1

Вы можете использовать таблицу чисел (у тебя еще есть?) для генерации месяцев:

SELECT
  ID,
  Period   = RIGHT(CONVERT(varchar(10), MonthStart, 103), 7),
  /*
  alternatively:
  Period = RIGHT('0' + RTRIM(MONTH(MonthStart), 2) + '/' + RTRIM(YEAR(MonthStart)),
  */
  FromDate = CASE WHEN RangeStart > MonthStart THEN RangeStart ELSE MonthStart END,
  ToDate   = CASE WHEN RangeEnd   < MonthEnd   THEN RangeEnd   ELSE MonthEnd   END
FROM (
  SELECT
    ID,
    RangeStart,
    RangeEnd,
    Monthstart,
    MonthEnd = DATEADD(DAY, -1, DATEADD(MONTH, 1, Monthstart))
  FROM (
    SELECT
      ID         = @ID,
      RangeStart = @RangeStart,
      RangeEnd   = @RangeEnd,
      MonthStart = DATEADD(MONTH, DATEDIFF(MONTH, 0, @RangeStart), 0)
    FROM numbers
    WHERE Number BETWEEN 0 AND DATEDIFF(MONTH, @RnageStart, @RangeEnd)
  ) m
) m

В качестве временной замены таблицы чисел, вы можете использоватьmaster..spt_values system tableили, точнее, его конкретное подмножество, гдеtype = 'P', Таким образом, вы можете просто заменитьFROM numbers выше с этим подпунктом:

FROM (
  SELECT Number
  FROM master..spt_values
  WHERE type = 'P'
) numbers

Похожие вопросы