/*
Возвращает дату и время в UTC (ISO 8601)
Например: 2010-02-08T15:41:07+03:00
*/
DELIMITER $$
DROP FUNCTION IF EXISTS UTC_DATETIME$$
CREATE FUNCTION UTC_DATETIME(dt datetime) RETURNS VARBINARY(255)
DETERMINISTIC
BEGIN
-- получаем смещение от мирового времени в минутах
DECLARE tz_minutes INT(11) DEFAULT TIMESTAMPDIFF(MINUTE, UTC_TIMESTAMP(), NOW());
RETURN CONCAT(
DATE_FORMAT(dt - INTERVAL tz_minutes MINUTE, '%Y-%m-%dT%H:%i:%s'),
IF(tz_minutes >= 0, '+', '-'),
DATE_FORMAT(DATE(NOW()) + INTERVAL ABS(tz_minutes) MINUTE, '%H:%i')
);
END$$
DELIMITER ;
-- SELECT UTC_DATETIME(NOW()), NOW()