在单个SELECT语句中消除两次相同值的计算

时间:2016-09-06 21:38:15

标签: mysql sql datetime

我需要修改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进行两次调用?

1 个答案:

答案 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