sql - MariaDB 查找当月的第一天并转换为 UTC
问题描述
我正在使用 MariaDB,我的记录都存储在 UTC 中,但是我希望能够根据我的本地时区找到过去 12 个日历月内的记录。
这是我采取的步骤:
SELECT
CURRENT_TIMESTAMP() AS Current_Date_And_Time_In_UTC,
CONVERT_TZ(CURRENT_TIMESTAMP(),'UTC','Pacific/Auckland') AS Current_Date_And_Time_In_Auckland,
DATE(CONVERT_TZ(CURRENT_TIMESTAMP(),'UTC','Pacific/Auckland')) AS Date_In_Auckland,
LAST_DAY(DATE(CONVERT_TZ(CURRENT_TIMESTAMP(),'UTC','Pacific/Auckland')) - INTERVAL 1 MONTH) AS Last_Day_Previous_Month_In_Auckland,
LAST_DAY(DATE(CONVERT_TZ(CURRENT_TIMESTAMP(),'UTC','Pacific/Auckland')) - INTERVAL 1 MONTH) + INTERVAL 1 DAY AS First_Day_Current_Month_In_Auckland,
TIMESTAMP(LAST_DAY(DATE(CONVERT_TZ(CURRENT_TIMESTAMP(),'UTC','Pacific/Auckland')) - INTERVAL 1 MONTH) + INTERVAL 1 DAY, MAKETIME(0,0,0)) AS First_Day_At_Midnight_Current_Month_In_Auckland,
CONVERT_TZ(TIMESTAMP(LAST_DAY(DATE(CONVERT_TZ(CURRENT_TIMESTAMP(),'UTC','Pacific/Auckland')) - INTERVAL 1 MONTH) + INTERVAL 1 DAY, MAKETIME(0,0,0)), 'Pacific/Auckland','UTC') AS First_Day_At_Midnight_Current_Month_In_UTC
这导致我将其用作我的范围:
SELECT
CONVERT_TZ(TIMESTAMP(LAST_DAY(DATE(CONVERT_TZ(CURRENT_TIMESTAMP(),'UTC','Pacific/Auckland')) - INTERVAL 13 MONTH) + INTERVAL 1 DAY, MAKETIME(0,0,0)), 'Pacific/Auckland','UTC') AS Start_DateTime_In_UTC,
CONVERT_TZ(TIMESTAMP(LAST_DAY(DATE(CONVERT_TZ(CURRENT_TIMESTAMP(),'UTC','Pacific/Auckland')) - INTERVAL 1 MONTH) + INTERVAL 1 DAY, MAKETIME(0,0,0)), 'Pacific/Auckland','UTC') AS End_DateTime_In_UTC
有没有更简单的方法来达到同样的效果?
解决方案
如果您有一列timestamp
数据类型,则根本不需要偏移。
该文件指出:
如果列使用
TIMESTAMP
数据类型,则任何插入的值在存储时都会从会话的时区转换为协调世界时 (UTC),并在检索时转换回会话的时区。
假设会话的时区设置为本地时区,根据过去 12 个月过滤列应该很简单:
where myts >= date_format(current_date, '%Y-%m-01') - interval 12 month
and myts < date_format(current_date, '%Y-%m-01')
推荐阅读
- cs-cart - 如何以 1 英镑的价格为产品 3 定价,或以 2 的价格为产品 3 定价?
- html - 是否有必要包含 width="auto" 因为这是默认设置?
- jquery - 查找给定“this”对象的 HTML 元素,该对象不是其子对象
- c# - 如何启用弹出提交的视图状态
- javascript - 加载不同的 jquery 版本时,条件注释不起作用(一个用于 IE8)
- swift - 如何使用 Swift 在控制台应用程序上进行非阻塞键盘输入?
- c# - 我需要“UWP 的 Windows 桌面扩展”,但我在参考窗口中没有找到它
- typescript - 如何在泛型类中编写“K extends keyof T”然后使用 K
- byte - Hexdump:在字节和两字节十进制之间转换
- memory - TCL中的RAM内存