2012-01-24 91 views
0

我根据作业类型和小时数试图找到的小时数直到现在从creationtime和分配的颜色之间的时间MySQL的计算号。 MySQL中的TIMEDIFF可用于查找小时数,但后来我无法使用IF来给出颜色。SELECT查询在两个日期时间

对于特定的作业类型,如果它的创建,并在两个多小时没有完成它在红色,否则对于其他作业类型和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 
+0

你得到什么肉酱此错误的 – 2012-01-24 06:28:06

+0

没有显示正确result..no错误查询运行的信息想它只是在FRM的解决方案前页后,我尝试VL完美 – rachel

回答

0

你的主要问题是在这里:

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

这并不意味着你认为这意味着什么。这相当于:

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

...因为在布尔操作像'ReviseItem'一个字符串是一个真正的类型。

在你的代码实际上是只比较jobtype'AddItem'。然后,您将针对'ReviseItem'(例如TRUEFALSE)以及对其执行布尔值||)的结果。 FALSE || 'ReviseItem'(这将计算为TRUE因为'ReviseItem'是“truey”),然后做一套结果对'EndItem',等等。

你应该改用为IN,就像这样:

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

这将计算为TRUEjobtype的值等于括号内的值之一。

+0

感谢它没有显示任何错误,这就是为什么我认为它的逻辑正确 – rachel

+0

它的语法正确,但逻辑错误。 :) –

+0

是的,这就是我说的其他方式! “我想,但我错了” – rachel

0

您是否尝试过存储过程,获取时间差异,并一次性重新运行正确的颜色?

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'); 
+0

感谢。 – rachel

0

您可以使用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

SELECT作业ID, \t \t CREATIONTIME, \t \t jobstatus, \t \t jobtype, \t \t STORE_ID, \t \t 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 \t \t FROM ebay.lms_jobs \t \t ORDER BY jobtype – rachel

+0

这是更新后的查询,但它显示结果jobstatus完成 – rachel

+0

添加'WHERE jobstatus!='complete''? –