SQL Календарь

ADO.NET
  1. 3 года назад

    Собственно вопрос возник из необходимости заполнить таблицу вида

    TABLE [dbo].[Calendar](
    	[ID] [int] IDENTITY(1,1) NOT NULL,
    	[Date] [date] NOT NULL,
    	[EmployeeID] [int] NOT NULL,
    	[Rang] [int] NOT NULL,

    массивом значений за месяц например за март и сделать это хотел операцией типа

    INSERT INTO [dbo].[Calendar]
    SELECT <массив_дат>, <Результат_хранимой_функции_от_даты_из_первого_столбца>, 2
    FROM <стандартная_таблица_дат>

    Собственно так и не смог найти ничего вразумительного и простого.
    Неужели нет никакого стандартного способа получить перечень(список) дат на месяц например, ну или вообще список, на месяц или промежуток можно уже будет и beetwin использовать или функции для работы с датами типа month
    Спасибо

  2. Накопал вот что

    DECLARE @date DATE = GETDATE()
    declare @MonthDate as int = MONTH(@date)
    declare @CountD as int = DAY(EOMONTH(@date ))
    declare @FirsDayM as date = CAST(CONCAT(YEAR(@date),'.',@MonthDate,'.01') as date)
    print @date
    print @MonthDate
    print @CountD
    select
    		top (@CountD)
    		dateadd(day, row_number() over (order by sc1.column_id) - 1, @FirsDayM) as CalendarDate
    	from sys.columns sc1

    в результате

    2014-04-01
    2014-04-02
    2014-04-03
    2014-04-04
    2014-04-05
    2014-04-06
    2014-04-07
    2014-04-08
    2014-04-09
    2014-04-10
    2014-04-11
    2014-04-12
    2014-04-13
    2014-04-14
    ....
    2014-04-30

    правда что за таблица sys.columns и для чего нужна точно не знаю ( как мне показалось это просто таблица с очень большим количеством строк, в примере откуда брал там использовали по 1000 строк)

  3. Alexandr_Erohin

    Apr 23 Администратор
    Добавлено 3 года назад Alexandr_Erohin

    В T-SQL есть удобная функция DATEADD, можно в цикле пройти и заполнить таблицу:

    -- На этой таблице я протестировал запрос
    CREATE TABLE Calendar(
        ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
        Date DATE NOT NULL
    )
    
    DECLARE
      @basedate DATETIME,
      @offset   INT
    SELECT
      @basedate = '2014-03-01',  -- Стартовый день
      @offset = 1			  -- Счетчик цикла
    
    WHILE (@offset <= 31)
    BEGIN
      INSERT INTO Calendar(Date) VALUES (@basedate)
      SELECT @offset = @offset + 1
      SELECT @basedate = DATEADD(DAY, 1, @basedate)
    END

    В результате добавятся даты с 01.03.14 по 31.03.14

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

  5. Найти это сообщение Alexandr_Erohin WHILE (@offset <= 31)
    BEGIN
    INSERT INTO Calendar(Date) VALUES (@basedate)
    SELECT offset = offset + 1
    SELECT basedate = DATEADD(DAY, 1, basedate)
    END

    WHILE (@offset <= 31) - получается в каждом месяце будет по 31 дню, поэтому я и вычислял

    declare @CountD as int = DAY(EOMONTH(@date ))

или зарегистрируйтесь чтобы ответить