2015-11-17 2 views
0

, поэтому я впервые пытаюсь разбивать разделы в mysql, любая помощь будет очень оценена. То, что я хочу, чтобы раздел, чтобы сделать, это получить, прежде чем меньше Cur даты для раздела 1, на следующей неделе в разделе 2 и максимальное значение для раздела 3.Первые попытки разделения диапазона в mysql

create TABLE diagnostics_daily_device_summary (
ID bigint(20) NOT NULL AUTO_INCREMENT, 
timestamp datetime, 

- есть и другие поля, включенные но ради пример я не надоест бросать их в

PRIMARY KEY (ID, timestamp) 
     ) 
     PARTITION BY RANGE (yearweek(timestamp))(
     PARTITION p1 VALUES LESS THAN (yearweek(curdate())), 
     PARTITION p2 VALUES LESS THAN (yearweek(date_add(curdate(), interval 7 day))), 
    PARTITION p3 VALUES LESS THAN maxvalue 
); 

мне нужно сохранить последние 3 недели данных, поэтому я разбить его на yearweek формат.

Когда я запускаю запрос сообщение об ошибке я получаю это

Код

Ошибка: 1064. Константа, случайная или временная зона, зависящие от выражения в (суб) функции разбиения не подпускают «), PARTITION p201547 ЗНАЧЕНИЯ МЕНЕЕ (yearweek (DATE_ADD (CURDATE(), интервал 7 d»в строке 70

Я не слишком уверен, как это исправить.

Кроме того, я хочу, чтобы добавить новую неделю каждую неделю, и падение на прошлой неделе я получил эту строку кода из онлайн-источника

USE demotimeparts; 
DROP PROCEDURE IF EXISTS rotateTimePartition; 
DELIMITER // 
CREATE PROCEDURE rotateTimePartition (newPartValue DATETIME) 
BEGIN 
     DECLARE keepStmt VARCHAR(2000) default @stms; 
     DECLARE partitionToDrop VARCHAR(64); 

    SELECT 201501 
    INTO partitionToDrop 
     -- FROM SCHEMA_NAME.partitions 
     WHERE table_schema='SCHEMA_NAME' 
     AND tabe_name='diagnostics_daily_device_summary' 
     AND partition_ordinary_position=1; 
    SET @stmt = CONCAT ('ALTER TABLE diagnostics_daily_device_summary DROP PARTITION' ,  partitionToDrop); 
    PREPARE pStmt FROM @stmt; 
    EXECUTE pStmt; 
    DEALLOCATE PREPARE pStmt; 

    SET @stmt = CONCAT ('ALTER TABLE diagnostics_daily_device_summary ADD PARTITION (PARTITION Y', 
         DATE_FORMAT(newPartValue, '%Y%m%d'), 
         ' VALUES LESS THAN (TO_DAYS(\'', 
         DATE_FORMAT(newPartValue, '%Y-%m-%d'), 
         '\')))'); 

    PREPARE pStmt FROM @stmt; 
    EXECUTE pStmt; 
    DEALLOCATE PREPARE pStmt; 

    SET @stmt = keepStmt; 
END // 
DELIMITER; 

Как я уже сказал, любая помощь будет принята с благодарностью! еще раз спасибо.

ответ

0

Ошибка «часового пояса» связана с тем, что не определенная неделя, в которой находится определенное время. Если изменение часового пояса, некоторые данные могут быть в неправильном разделе, в результате чего SELECTs даст неправильный ответ.

Кроме того, CURDATE() будет оцениваться во время CREATE TABLE. Я подозреваю, что это не то, что вы хотели.

Поскольку вы хотите отказаться от старых данных и т. Д., Я предлагаю вам просто пойти с днями или неделями и использовать постоянные даты (используя TO_DAYS()). Посмотрите на http://mysql.rjweb.org/doc.php/partitionmaint для получения подробной информации о том, как сделать поворот и советы по другим вопросам.

Смежные вопросы