циклическая инструкция SQL insert с датами

Мне нужно запустить инструкцию, которая будет заполнять базу данных одной и той же информацией каждый раз, когда ИСКЛЮЧАЕТ дату.

im в настоящее время пытается что-то в этом направлении и не повезло.

DECLARE i_int BINARY_INTEGER := 1; BEGIN WHILE i_int <= 30 LOOP INSERT INTO bs_events (eventDate,eventTime,title,spaces,description,entryFee,payment_required,max_qty,allow_multiple) VALUES ('2011-03-i_int 00:00:00', '10:00','Carpet Cleaner 3000','4','This is rad','25.99','1','1','2'); i_int := i_int + 1; END LOOP; END; / 

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

В основном я хочу, чтобы дата увеличивалась на один с 01-30, а затем я вручную изменил месяц и снова запустил сценарий за все 12 месяцев года.

Подумайте о создании таблицы календаря .

Первая таблица, которую я создаю в любой базе данных, с которой я работаю, представляет собой таблицу чисел от 1 до 1000000. Такая таблица полезна для множества целей, таких как реализация циклов в SQL. Кроме того, его можно использовать для создания второй таблицы, которую я создаю в любой базе данных, с которой я работаю: Таблица календаря.

Таблица календаря имеет одну строку для каждой даты, начиная с первого зарегистрированного бизнес-события в вашей базе данных (плюс год или около того). Сохраняйте достаточные будущие даты для всех соответствующих бизнес-запросов (плюс несколько лет, чтобы быть в безопасности).

Ваша конкретная проблема может быть решена с помощью любой из приведенных выше таблиц, но подход таблицы календаря будет намного проще.

Я дам вам тривиальный, но рабочий пример в MySQL ниже:

 create table digits(n int); insert into digits values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); create table numbers( n int not null ,primary key(n) ); 

Таблица цифр – это только рабочая таблица, она будет удалена после создания таблицы реальных чисел. Таблица чисел имеет только один столбец, это первичный ключ. Затем создайте 1 миллион последовательных целых чисел, начиная с 1. (Звучит медленно, но на самом деле он заканчивается менее чем через 10 секунд на моем 2-летнем ноутбуке).

 insert into numbers(n) select 1 + (d1.n * 1) + (d2.n * 10) + (d3.n * 100) + (d4.n * 1000) + (d5.n * 10000) + (d6.n * 100000) as n from digits d1 ,digits d2 ,digits d3 ,digits d4 ,digits d5 ,digits d6; /* Drop the working table. */ drop table digits; 

Затем я создам таблицу календаря. Очевидно, на данный момент это совершенно бесполезно, так как у него нет полезных столбцов. Примерами полезных столбцов являются год, имя месяца, номер недели, isFirstMonthDay, isLastMonthDay, финансовый год, isHoliday, имя праздника, имя дня, квартал, третичный. Для нестандартных периодов это золото.

 create table calendar( datum date not null ,primary key(datum) ); 

Итак, теперь мы можем использовать таблицу чисел, например, для работы в качестве генератора строк для построения нашей таблицы календаря. Предположим, я хочу сгенерировать все даты между 2000-01-01 и 2019-12-31. Это будет 7305 дней. Просто выберите только несколько строк из таблицы чисел и добавьте столбец N в дату. Это создаст список возрастающих дат.

 insert into calendar(datum) select date_add('1999-12-31', interval n day) from numbers where n <=7305; 

Готово. Вероятно, вы могли бы понять, как решить свою проблему, просто используя таблицу чисел?

Наконец, вот пример того, как решить вашу конкретную проблему, используя таблицу календаря. Конечно, было бы еще проще, если бы вы добавили столбцы для Года и Месяца. Здесь я интерпретирую ваш вопрос как означающий «Создайте одну идентичную строку для каждого дня каждого месяца, до конца года».

 insert into bs_events( eventDate, eventTime, title ,spaces, description, entryFee ,payment_required, max_qty, allow_multiple ) select datum, '10:00', 'Carpet Cleaner 3000' ,'4', 'This is rad', '25.99' ,'1', '1', '2' from calendar where datum >= date '2011-03-01' and datum <= date '2011-12-31'; 

Вы можете попробовать DATEADD(ms,i_int,GETDATE()) для вашей даты.

 INSERT INTO bs_events (eventDate, ... ) VALUES ('2011-03-i_int 00:00:00', ...); 

Это значение, 2011-03-i_int 00:00:00 , является строкой, а не меткой времени. Вы надеялись, что ваша среда SQL заменит значение i_int для его символа. Это не будет сделано.

Вместо этого выполните арифметику даты вне инструкции INSERT.

В PostgreSQL (PL / pgsql) вы можете сделать это, чтобы добавить день к переменной типа timestamp.

 this_date = this_date + interval '1 day'; 

И в заявлении INSERT,

 INSERT INTO bs_events (eventDate, ... ) VALUES (this_date, ...); 

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

 DECLARE i_int BINARY_INTEGER := 0; BEGIN WHILE i_int < 30 LOOP INSERT INTO bs_events ( eventDate, eventTime, title, spaces, description, entryFee, payment_required, max_qty, allow_multiple) VALUES ( DATEADD(day, i_int, '2011-03-01 00:00:00'), '10:00', 'Carpet Cleaner 3000', '4', 'This is rad', '25.99', '1', '1', '2'); i_int := i_int + 1; END LOOP; END; /