복붙노트

[SQL] 날짜와 SQL 삽입 문을 루핑

SQL

날짜와 SQL 삽입 문을 루핑

나는 날짜를 제외하고는 동일한 정보로 할 때마다 데이터베이스를 채울 것입니다 문을 실행해야합니다.

메신저는 현재이 라인을 따라 뭔가를 시도하고 행운을 가지고 있지 않습니다.

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. ==============================

    1.일정 테이블을 만드는 것이 좋습니다.

    일정 테이블을 만드는 것이 좋습니다.

    내가 가진 모든 데이터베이스 I 작업에서 만드는 첫 번째 테이블은, 숫자의 테이블, 1 1000000에 이러한 테이블은 SQL에서 루프를 구현하는 등의 목적으로 많이 유용합니다. 달력 테이블 : 또한, 내가 가진 모든 데이터베이스 I 작업에 만든 두 번째 테이블을 생성 할 수 있습니다.

    달력 테이블은 데이터베이스에서 처음으로 기록 된 비즈니스 이벤트 (년 정도 플러스)에서 시작하여, 각 날짜에 대해 하나의 행이 있습니다. 모든 관련 비즈니스 쿼리 (플러스 몇 년 안전을 위해) 충분한 미래의 날짜를 유지합니다.

    특정 문제는 위의 테이블 중 하나를 사용하여 해결 될 수 있지만, 달력 테이블 접근 방식은 훨씬 쉬울 것이다.

    나는 아래에 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)
    );
    

    실제 숫자 테이블이 생성되면 숫자 표는 작업 테이블이 삭제됩니다된다. 숫자 테이블은 기본 키이다, 한 열이 있습니다. 다음으로, (그것은 천천히 소리,하지만 실제로 내 2 살 노트북에 10 초 이내에 완료) 1. 시작 1 개 백만 연속 정수를 생성합니다.

    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;
    

    다음으로, 나는 달력 테이블을 만듭니다. 이 유용한 열 필요가 없기 때문에 분명히 그것은 순간에 꽤 쓸모가 없다. 유용한 컬럼의 예로는 올해 MONTHNAME, 주 번호, isFirstMonthDay, isLastMonthDay, 회계 연도, isHoliday, Holidayname, DAYNAME, 분기, tertial 있습니다. 표준이 아닌 기간의 경우,이 황금이다.

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

    자, 이제 우리는 우리의 달력 테이블을 구축하는 행 발전기 역할을, 예를 들어 숫자 테이블을 사용할 수 있습니다. 하자 내가 2000-01-01와 2019년 12월 31일 사이의 모든 날짜를 생성하고 싶은 말은. 즉 7천3백5일 될 것이다. 쉬운, 그냥 숫자 테이블에서 많은 행을 선택하고 날짜로 INT 열 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';
    
  2. ==============================

    2.당신은 당신의 날짜를 DATEADD (MS, i_int, GETDATE ()을) 시도 할 수 있습니다.

    당신은 당신의 날짜를 DATEADD (MS, i_int, GETDATE ()을) 시도 할 수 있습니다.

  3. ==============================

    3.

    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의) 당신은 유형 '타임 스탬프'의 변수에 일을 추가하는이 작업을 수행 할 수 있습니다.

    this_date = this_date + interval '1 day';
    

    그리고 INSERT 문에서,

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

    구문이 플랫폼이 될 수있는 것을 확인하려면 설명서를 참조하십시오.

  4. ==============================

    4.

    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;
      /
    
  5. from https://stackoverflow.com/questions/5116369/looping-a-sql-insert-statement-with-dates by cc-by-sa and MIT license