使用Mysql将UTC 12小时时间格式转换为印度时间

时间:2016-05-24 06:14:37

标签: mysql

我正在Mysql中编写一个事件调度程序,用于在用户旅行时间前3小时生成票证。 Mysl安装在服务器中,服务器时间为UTC,12小时格式,与IST时间相差5:30小时。我有一个用户早上7:30的旅行时间,所以我需要在凌晨4:30为这个用户生成票。我正在获得当前服务器时间并转换为IST并且比较旅行时间和当前转换时间差为3小时。但是一些如何失败并且总是在早上10点创建门票。下面是我在Mysql中的完整事件,

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 route_id=@RouteId AND route_schedule_id=@RoutScheduleId
                   AND user_id=UserId AND DATE(date_of_issue)=@ISTDATE) 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 ;

如果有任何其他方式转换时间或我在上述查询中未注意到的错误,请告诉我。

此致 桑杰塔

1 个答案:

答案 0 :(得分: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()从给定的时区转换日期时间值dt   from_tz到to_tz给出的时区并返回结果   值

也许警告适用于你?

  

警告

     

如果您的系统有zoneinfo,请不要使用可下载的软件包   数据库。请改用mysql_tzinfo_to_sql实用程序。否则,你   可能会导致MySQL和其他日期时间处理的差异   您系统上的应用程序。

我会将其分解为一个简约的例子,看看是否有效。 以下是我如何测试基础知识:

简单示例:

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

所以你可以建立一个查询来确定像这样的timediff:

HOUR(TIMEDIFF(   CONVERT_TZ('2016-05-24 12:00:00','GMT','MET'),   '2016-05-24 12:00:00' ))