2012-01-24 53 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''? –