2017-10-02 10 views
0

우리는 다른 날짜에 유지 관리가 필요한 다른 종류의 장비를 데이터베이스에 만들었습니다. 또한 유지 기간도 다릅니다 (때로는 매월, 때로는 2 주마다 등). 이제 유지 관리 날짜를 변경하면 자동으로 업데이트되는 열이 있어야합니다. 우리가 일반적으로 사용하는 것은 NextMaintDate에 대한 모든 날짜가 한 달 MaintDate 이후 결과mysql 하나의 테이블에서 서로 다른 시간 간격

UPDATE table SET NextMaintDate = MaintDate + INTERVAL 1 month 

입니다. 다른 MaintDate를 사용하여 다른 간격을 가질 가능성이 있습니까?

답변

1

사용 CASE WHEN :

UPDATE table SET NextMaintDate = 
    CASE WHEN type = 'monthly' THEN MaintDate + INTERVAL 1 month 
     WHEN type = 'weekly' THEN MaintDate + INTERVAL 1 week 
     WHEN type = 'daily' THEN MaintDate + INTERVAL 1 day 
    END 
+0

이것을 시도하면 '필드 목록'에 알 수없는 열 'type'이 표시됩니다. – Kiekster

+0

@Kiekster. . . 데이터에 해당 열을 포함시켜야합니다. –

+0

@Kiekster : 어떤 간격이 적용되는지 나타내는 것이 있어야합니다. 나는'type'이라는 컬럼을 가지고 예제를 만들었습니다. 레코드에 다른 열 또는 대신 사용할 열이 포함됩니다. –

0

MySQL의 5.7.6 이상을 사용하는 경우, 당신은 당신의 테이블 정의에서 계산 된 열을 사용할 수

CREATE TABLE yourTable (
    id INTEGER NOT NULL PRIMARY KEY, 
    MaintDate DATETIME NOT NULL, 
    ... 
    NextMaintDate AS DATE_ADD(MaintDate, INTERVAL 1 MONTH) 
); 

MaintDate 열이 업데이트 될 때 이제 때마다, NextMaintDate는 것이다 자동으로 업데이트됩니다 (논리적으로는 적어도).

생성 된 열에 대해 VIRTUAL 또는 STORED을 선택할 수 있습니다. 즉, 즉시 계산할 것인지 아니면 실제로 데이터를 유지할 것인지에 따라 선택할 수 있습니다.

다른 간격과 관련하여 더 많은 계산 된 열을 추가 할 수 있습니다.

0

당신은 두 개의 열이 당신의 테이블을 수정합니다 :

  • maintenance_interval_type이 간격
  • maintenance_interval_num의 유형입니다 것은 숫자 그리고

당신은 할 수 있습니다 :

update t 
    set NextMaintDate = (case when maintenance_interval_type = 'month' 
           then maintdate + interval maintenance_interval_num month 
           when maintenance_interval_type = 'week' 
           then maintdate + interval maintenance_interval_num week 
           when maintenance_interval_type = 'day' 
           then maintdate + interval maintenance_interval_num day 

          else maintenance_interval_num 
        end); 

명시 적 유형을 사용하여이 작업을 수행 할 수도 있습니다. 이 같은 것은 :

update t 
    set NextMaintDate = (case when equipment_type in (. . .) 
           then maintdate + interval 2 week 
           when maintenance_interval_type = 'week' 
           else maintdate + interval 1 month 
         end); 

데이터 구조를 변경할 필요가 없습니다.