ВЫБЕРИТЕ ЗАПРОС В ВЫЧИСЛЕНИИ MYSQL Количество часов между двумя датами и временем - PullRequest
0 голосов
/ 24 января 2012

Я пытаюсь найти количество часов до creationtime и назначаю цвет в зависимости от типа задания и количества часов. TIMEDIFF в MySQL можно использовать для определения количества часов, но тогда я не могу использовать IF для придания цвета.

Для определенного типа задания, если оно создано и не выполнено в течение двух часов, оно отображается красным цветом, в противном случае для других типов заданий и 18 часов красным цветом.

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

SELECT jobid,   creationtime, jobstatus, 
       jobtype, store_id,
       IF( ( TIMESTAMPDIFF( HOUR, creationtime, NOW() ) > 2 ) &&
           jobstatus NOT IN( 'complete', 'aborted' )          && 
           jobtype IN( 'AddItem', 'ReviseItem', 'EndItem', 'SoldReport', 
                       'ReviseFixedPriceItem',  'AddFixedPriceItem',
                       'EndFixedPriceItem'
                   ),
         'red',
         IF( ( TIMESTAMPDIFF( HOUR, creationtime, NOW() ) > 18 ) &&
             jobstatus NOT IN( 'complete', 'aborted' )           &&
             jobtype = 'ActiveInventoryReport',
           'red',
           'white'
         )
       ) AS jobstatus_color
  FROM ebay.lms_jobs
  ORDER BY jobtype

Ответы [ 3 ]

0 голосов
/ 24 января 2012

Ваша главная проблема здесь:

jobtype = 'AddItem' || 'ReviseItem' || 'EndItem' ||
          'SoldReport' || 'ReviseFixedPriceItem' ||
          'AddFixedPriceItem' || 'EndFixedPriceItem'

Это не значит, что вы думаете, это значит. Это эквивалентно:

( jobtype = 'AddItem' ) || TRUE || TRUE || TRUE || ...

... потому что в логической операции строка типа 'ReviseItem' является истинным типом.

В вашем коде вы фактически сравниваете jobtype с 'AddItem'. Затем вы берете результат этого (который будет TRUE или FALSE) и выполняете логическое ИЛИ (||) его против 'ReviseItem', например, FALSE || 'ReviseItem' (который оценивается как TRUE, потому что 'ReviseItem' является "истинным"), а затем делает еще один ИЛИ с его результатом против 'EndItem' и т. Д.

Вместо этого вы должны использовать IN, вот так:

jobtype IN( 'AddItem', 'ReviseItem', 'EndItem', 'SoldReport', ... )

Это будет равно TRUE, если значение jobtype равно одному из значений в скобках.

0 голосов
/ 24 января 2012

Вы можете использовать TIMESTAMPDIFF(HOUR,creationtime,NOW().

Это работает NOW() - creationtime в часах, так что вы можете сравнить с целым числом (это 2 часа, которые вы хотели, а не 2 дня,правильно?).

SELECT jobid,
      creationtime,
      jobstatus, 
      jobtype,  
      store_id,
      IF( (TIMESTAMPDIFF(HOUR,creationtime,NOW()) > 2) && jobstatus!='complete' 
          &&  jobtype IN('AddItem','ReviseItem','EndItem','SoldReport', 
                'ReviseFixedPriceItem','AddFixedPriceItem','EndFixedPriceItem'), 
          'red',
          IF( (TIMESTAMPDIFF(HOUR,creationtime,NOW()) > 18) && jobstatus!='complete'
             && jobtype ='ActiveInventoryReport',
             'red',
             'white'
            )
        ) AS jobstatus_color
    FROM ebay.lms_jobs
    ORDER BY jobtype
0 голосов
/ 24 января 2012

Пробовали ли вы хранимую процедуру, чтобы получить разницу во времени и повторно запустить правильный цвет за один раз?

Нашли этот образец в Интернете по адресу http://www.artfulsoftware.com/infotree/queries.php#841:

DROP FUNCTION IF EXISTS PeriodLen; 
DROP FUNCTION IF EXISTS NumLabel; 
DELIMITER go 
CREATE FUNCTION PeriodLen( dt1 datetime, dt2 datetime ) RETURNS CHAR(128) 
BEGIN 
  DECLARE yy,m0,mm,d0,dd,hh,mi,ss,t1 BIGINT; 
  DECLARE dtmp DATETIME; 
  DECLARE t0 TIMESTAMP; 
  SET yy = TIMESTAMPDIFF(YEAR,dt1,dt2); 
  SET m0 = TIMESTAMPDIFF(MONTH,dt1,dt2); 
  SET mm = m0 MOD 12; 
  SET dtmp = ADDDATE(dt1, interval m0 MONTH); 
  SET d0 = TIMESTAMPDIFF(DAY,dt1,dt2); 
  SET dd = TIMESTAMPDIFF(DAY,dtmp,dt2);  
  SET t0 = TIMESTAMPADD(DAY,d0,dt1); 
  SET t1 = TIME_TO_SEC(TIMEDIFF(dt2,t0)); 
  SET hh = FLOOR(t1/3600); 
  SET mi = FLOOR(t1/60) - 60*hh; 
  SET ss = t1 - 3600*hh - 60*mi; 
  RETURN CONCAT( NumLabel(yy,'year'), NumLabel(mm,'month'),  
                 Numlabel(dd,'day'), NumLabel(hh,'hour'),  
                 NumLabel(mi,'min'), NumLabel(ss,'sec')  
               ); 
END; 
go 
CREATE FUNCTION NumLabel( ival int, clabel char(16) ) RETURNS VARCHAR(24) 
RETURN Concat( ival, ' ', clabel, If(ival=1,' ','s ') ); 
go 
DELIMITER ; 


SELECT PeriodLen( '2000-7-1 20:34:35', '2011-08-24 15:53:42' ); 
+---------------------------------------------------------+ 
| PeriodLen( '2000-7-1 20:34:35', '2011-08-24 15:53:42' ) | 
+---------------------------------------------------------+ 
| 11 years 1 month 22 days 19 hours 19 mins 7 secs        | 
+---------------------------------------------------------+ 

Просто измените его, чтобы он возвращал цвет вместо промежутка времени.

Назовите его так:

SELECT PeriodLen( '2000-7-1 20:34:35', '2011-08-24 15:53:42' );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...