2016-05-24 14 views
0

私は、ユーザー旅行時間の3時間前にチケットを生成するためのイベントスケジューラをMysqlに作成しています。 Myslは、サーバ時間がUTCで、IST時間との5時30分の時間を持つ12時間形式のサーバにインストールされます。旅行時間が朝7時30分の1人のユーザーがいるので、朝4時半にこのユーザー用のチケットを生成する必要があります。現在のサーバー時間を取得してISTに変換し、移動時間と現在の変換時間差を比較するのは3時間です。しかし、午前10時に失敗して常にチケットがどのように作成されているのか。以下は、MySQLの、Mysqlを使用してUTCの12時間形式をインディアン時刻に変換する

DELIMITER $$ 

ALTER EVENT `Auto_Generated_Ticket` ON SCHEDULE EVERY 1 MINUTE STARTS CURRENT_TIMESTAMP ON COMPLETION PRESERVE ENABLE DO BEGIN 
    DECLARE UserId INT; 
    DECLARE v_finished INT DEFAULT 0; 
    DECLARE GetDate DATE DEFAULT DATE(NOW()); 


    /*get all active user's who's tariff enddate is > today and available journeys > 0 and pass-status=4(delivered)*/ 
    DECLARE ActiveUserId CURSOR FOR 
     SELECT UT.user_id FROM `um.user_trs.tariff` UT 
    INNER JOIN `um.user` U ON U.user_id=UT.user_id 
    INNER JOIN `um.user_ps.pass` UP ON UP.user_id=UT.user_id 
    INNER JOIN `ps.pass` P ON P.pass_id=UP.pass_id 
    WHERE UT.end_date >=DATE(NOW()) AND UT.available_journeys > 0 AND UT.current_balance>0 AND P.status_id=4 
    GROUP BY UT.user_id; 

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished=1; 
    SET @GetTime= DATE_FORMAT(NOW(),'%Y-%m-%d %h:%i:%s %p'); 
    OPEN ActiveUserId; 
     get_userid:LOOP 
     FETCH ActiveUserId INTO UserId; 
     IF v_finished=1 THEN 
     LEAVE get_userid; 
     END IF; 

     SET @StartTime=(SELECT RS.start_time FROM `um.user_rm.route` UR 
       INNER JOIN `rm.route_schedule` RS ON RS.route_schedule_id=UR.route_schedule_id 
       WHERE UR.user_id=UserId 
       ORDER BY ABS(TIMEDIFF(RS.`start_time`, TIME(CONVERT_TZ(@GetTime,'+00:00','+05:30')))) LIMIT 1); 

     SET @TimeDiff=(HOUR(TIMEDIFF(@StartTime,TIME(CONVERT_TZ(@GetTime,'+00:00','+05:30'))))); 


      /*if time difference between current time and schedule start time is 3 hours then generate ticket for the user for that particular schedule*/ 
     IF (@TimeDiff =3) THEN 
      /*IF (@TNumber IS NULL) THEN*/ 
      IF NOT EXISTS(SELECT ticket_number FROM `um.user_ts.ticket` WHERE [email protected] AND [email protected] 
        AND user_id=UserId AND DATE(date_of_issue)[email protected]) THEN 
      INSERT INTO `um.user_ts.ticket` 
       (
        `user_id`,`route_id`,`route_schedule_id`,`ticket_number`,`date_of_issue`,`is_cancelled`, 
        `amount_charged`,`user_tariff_id`,`opening_balance`,`is_auto_generated` 
       ) 
       VALUES 
       (
       UserId,@RouteId,@RoutScheduleId,@TicketNumber,CONVERT_TZ(UTC_TIMESTAMP(),'+00:00','+05:30'), 
       FALSE,@PerJourneyCost,@UserTariffId,@TariffCurrentBalance,1 
       ); 


      END IF;/*end of route and schedule check*/ 
     END IF; /*end of time difference check*/ 
     END LOOP get_userid; 
     CLOSE ActiveUserId;  
    END$$ 

DELIMITER ; 

の私の完全なイベントwrittentである私は、時間または私は上記のクエリでは気付いていないですどんな間違いを変換する場合は、他の方法を教えてください。

よろしく サンギータ

+1

[最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve)を参照してください。 –

答えて

0

そうする専用のmysqlコマンドがあります。 CONVERT_TZ(dt,from_tz,to_tz) は、そのドキュメントからここでhttps://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html#function_convert-tz

参照:

CONVERT_TZは()to_tzによって指定されたタイムゾーンに FROM_TZによって指定されたタイムゾーンの日時値DTに変換し、得られた 値を返し

警告が適用されることがありますか?お使いのシステムは、zoneinfoの データベースを持っている場合は、ダウンロードパッケージを使用しないでください

警告

。代わりにmysql_tzinfo_to_sqlユーティリティを使用してください。そうでないと、 はMySQLとシステム上の他の アプリケーション間のdatetime処理に差異を引き起こす可能性があります。

私はこれを最小限の例に分解し、これが機能するかどうかを確認します。 は、ここで私は基本をテストするためにそれを行うだろう方法は次のとおりです。

簡単な例

HOUR(TIMEDIFF( CONVERT_TZ(:

SELECT CONVERT_TZ('2016-05-24 12:00:00','GMT','MET'); 

だから、あなたがこのようなtimediffを決定するために、クエリを構築することができ'2016-05-24 12:00:00 '、' GMT '、' MET ')、 ' 2016-05-24 12:00:00 ' ))

関連する問題