我正在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 ;
如果有任何其他方式转换时间或我在上述查询中未注意到的错误,请告诉我。
此致 桑杰塔
答案 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' ))