我需要修改datetime字段的输出,以便它返回该日期所在的第一天。例如,如果日期是2016年2月9日,则应该返回8/29/2016,因为那是该周的星期一(我想要星期一,而不是星期天)。但是,我还需要将时间戳转换为不同的时区。结果是我最终必须将时区转换两次:
CONVERT_TZ(timestamp, '+00:00', '+05:00') - INTERVAL WEEKDAY(CONVERT_TZ(timestamp, '+00:00', '+05:00')) day
我不能简单地对UTC日期时间执行INTERVAL
计算,然后在结果上转换时区,因为时区转换可能会影响WEEKDAY
函数的结果,例如对于EST,日期时间2016-9-5 00:00 UTC
实际上会落在9/4,从而导致它成为不同星期的一部分。
有没有办法避免在CONVERT_TZ
声明中对SELECT
进行两次调用?
答案 0 :(得分:1)
您可以将其放入子查询中。
SELECT converted - INTERVAL WEEKDAY(converted) AS day
FROM (SELECT CONVERT_TZ(timestamp, '+00:00', '+05:00') AS converted
FROM yourTable) AS x
另一种方法是分配用户变量。为了能够使用它两次,将赋值放入IF()
表达式的条件部分 - 这可以确保在使用之前完成赋值。
IF(@converted := CONVERT_TZ(timestamp, '+00:00', '+05:00'),
@converted - INTERVAL(WEEKDAY(@converted) DAY,
NULL) AS day