2015-09-29 7 views
1

У меня есть таблица с именем TICKET. Среди столбцов в билете два поля даты:Обновление столбца MySQL на основе данных другого столбца

TICKET 
---------------------------------------- 
TICKDATE    | ELSDATE  | ... 
---------------------+-------------+---- 
yyyy-mm-dd hh:mm:ss yyyy-mm-dd 

Эти две даты всегда должны быть одинаковыми.

У меня есть диапазон дат (от 7/1 до текущего), где ELSDATE равно null. Я только начинаю писать в sql-скриптах, и я не знаю, как обновить один столбец, чтобы он соответствовал другому. Текущий сценарий я бегу, чтобы обновить один день на время:

update TICKET ELSDATE="yyyy-mm-dd" where date(TICKDATE)="yyyy-mm-dd" 

Я предполагаю, что я смогу сделать что-то вроде:

update TICKET where ELSDATE="???" date(TICKDATE)<date("2015-09-29") 
+0

Если они всегда должны быть такими же, почему бы вам не просто удалить этот столбец? Он занимает место, не давая вам никакой пользы. – Sumurai8

+1

@ Sumurai8 TICKDATE и ELSDATE записываются из двух приложений на удаленных сайтах. TICKDATE считывается приложением мониторинга как на месте, так и удаленно. ELSDATE опрошено нашей инфраструктурой бизнес-аналитики. Это очень глупо, но это хорошо продуманная глупость, которую трудно изменить. –

ответ

3

Если вы хотите установить все значения ELSDATE к значению TICKDATE в той же строке, где TICKDATE находится до 29 сентября 2015 года, используйте:

UPDATE TICKET SET ELSDATE = TICKDATE where TICKDATE < "2015-09-29" 
+0

Это не может использовать какой-либо индекс в 'TICKDATE'. Я бы предложил' TICKDATE <"2015-09-29" ' – Arth

+0

@Arth Вы можете объяснить? Я не уверен, что это значит. –

+2

Если в столбце 'TICKDATE' есть индекс, запрос, который непосредственно сравнивает его, может использовать индекс для поиска строк, соответствующих сопоставлению. Это предпочтительнее в отношении производительности для доступа к каждой строке, чтобы найти соответствующие строки. – Arth

1

вы можете сделать все обновления в одном запросе, поэтому вам не придется делать их один день в время. Запрос будет меняться каждую строку ELSDATE равной TICKDATE

UPDATE TICKET SET ELSDATE = TICKDATE; 

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

UPDATE TICKET SET ELSDATE = TICKDATE WHERE ELSDATE IS NULL; 

Чтобы изменить строки между двумя датами, используйте предложение BETWEEN.

UPDATE TICKET SET ELSDATE = TICKDATE WHERE TICKDATE BETWEEN '2015-07-01' AND CURDATE(); 
+0

Будет ли последнее утверждение включать 'CURDATE()'? Очень важно, чтобы ELSDATE по-прежнему «null» на данных с сегодняшнего дня. –

+2

@AdamSmith Будет. Если вы этого не хотите, используйте это Where-Clause: '... WHERE TICKDATE> '2015-07-01' AND TICKDATE C4u

+1

@ C4ud3x Спасибо за разъяснение! В этом случае я могу обновить все строки старше, чем сегодня, поэтому мне не нужно об этом беспокоиться. Тем не менее, здорово знать, какие у меня варианты! –

2

Yep:

UPDATE TICKET 
    SET ELSDATE = TICKDATE 
WHERE TICKDATE < CURDATE() /* AND ELSDATE IS NULL */ 
Смежные вопросы