当前位置: 首页 > 知识库问答 >
问题:

MySQL需要在EST中显示时区,但不能更改全局时间设置

马涵蓄
2023-03-14

我面临一个奇怪的问题。mySQL中的全局时区设置是UTC。mySQL的一个实例中有多个表(子数据库)(我使用database.NET作为管理器);所以我不能改变全球时区。

以下是我的质疑。我只需要在EST中显示时间。我已经看到了一些解决方案与@sesisionTimeZone,但他们不工作。此外,我正在运行的数据收集到晚上9点东部时间的问题,但在世界协调时,这是在第二天凌晨1点。

我的主要困惑是数据已经存储在UTC表中;然而,我希望看到那些datetime字段显示在EST中。

cartId是数字字段createDate是日期时间字段

我只是在用http://fishcodelib.com/database.htm 并连接到mySQL数据库。

SELECT   DATE(createDate)
    ,DATE_FORMAT(createDate, '%l%p') as HourOfDay
    ,count(cartId) as numCarts_ALL

FROM carts
WHERE createDate >= '2014-09-24' 
      AND createDate < '2014-10-01'
      AND HOUR(createDate) >= 10 AND HOUR(createDate) <21   
GROUP by DATE(createDate),HOUR(createDate)
;

我真的很感激任何帮助。再次感谢

共有2个答案

居星阑
2023-03-14

要将datetime从一个时区转换为另一个时区:

SELECT DATE(CONVERT_TZ(createDate, '+00:00', '-04:00')) createdDate,
       HOUR(CONVERT_TZ(createDate, '+00:00', '-04:00')) hourOfDay
FROM carts
WHERE
    createDate BETWEEN CURRENT_DATE + INTERVAL 16 HOUR AND CURRENT_DATE + INTERVAL 26 HOUR
GROUP BY createdDate, hourOfDay

不同的日期

SELECT DATE(CONVERT_TZ(createDate, '+00:00', '-04:00')) createdDate,
       HOUR(CONVERT_TZ(createDate, '+00:00', '-04:00')) hourOfDay
FROM carts
WHERE
    createDate BETWEEN '2014-09-24' AND '2014-10-01'
GROUP BY createdDate, hourOfDay
    HAVING hourOfDay <= 2 OR hourOfDay >= 20

你可能会想"为什么不在WHERE子句中?"

如果where子句中使用了函数,则无法使用索引(这将导致全表扫描)。所以只需过滤掉daterange中的记录,以及HAVING子句中的小时数

供参考

CURRENT_DATE + INTERVAL 16 HOUR

是的缩写

DATE_ADD(CURRENT_DATE, INTERVAL 16 HOUR)
吴丁雷
2023-03-14

DATETIME数据类型不受全局或连接本地时区设置的影响。这只适用于TIMESTAMP数据类型。这解释了为什么你试图用@@会话混日子。TimeZone没有任何影响。now()CURDATE()受到影响。

您说您的DATETIME数据存储在UTC中。太好了。如果您以这种方式存储数据,生活会轻松得多。

在您使用我将要给您的建议之前,请确保您的MySQL服务器已正确加载其时区表。执行此命令并确保没有得到空结果。

 SELECT CONVERT_TZ(NOW(), 'America/New_York', 'UTC')

如果这不起作用——如果出现NULL或错误——则需要让服务器人员加载时区表。他们应该这样做。他们知道怎么做。(如果他们没有,你应该找一家新的服务提供商。)

我们需要使用名为“America/New_York”的时区,因为您可能希望在每年的适当日期在EDT和EST之间自动切换。

现在,要从表中检索正确转换的UTCDATETIME值,请执行以下操作:

SELECT CONVERT_TZ(createDate, 'UTC', 'America/New_York') AS createDate
  FROM yourTable

这很酷,因为如果用户位于不同的时区,可以将时区设置设置为用户首选项。

要将本地时间值存储为UTC,只需反向执行即可。例如

INSERT INTO yourTable (createDate) VALUES (CONVERT_TZ(?, 'America/New_York', 'UTC'))

现在做

SELECT NOW()

并查看now()是在当地时间还是在UTC。如果它在UTC中,那么您应该通过执行SETTIME_ZONE='America/New_York'来开始您的会话。这将使您的时区设置正确,以便now()CURDATE()执行您想要的操作。

然后,要从表中获取昨天的(本地时间)行,请执行以下操作:

WHERE createDate >= CONVERT_TZ(CURDATE(),'America/New_York','UTC') - INTERVAL 1 DAY
  AND createDate <  CONVERT_TZ(CURDATE(),'America/New_York','UTC')

这将把当地午夜时间转换为UTC,并获取项目范围。

要获取从今天下午4点到明天凌晨2点的所有数据,您可以执行以下操作:

今天下午4点(本地时间)是CURDATE(),间隔16小时。明天凌晨2点是CURDATE()间隔26小时或者你可以写它CURDATE()间隔1天间隔2小时

因此,获取该范围需要:

WHERE createDate >= CONVERT_TZ(CURDATE() + INTERVAL 16 HOUR,'America/New_York','UTC')
  AND createDate <  CONVERT_TZ(CURDATE() + INTERVAL 26 HOUR,'America/New_York','UTC')

如果您愿意将普通日期对象和普通时间对象组合在一起,您还可以使用ADDTime(CURDATE(),'16:00')来获取今天下午4点的DATETIME值。同样,你可以得到明天凌晨2点这样:

  ADDTIME(CURDATE(),'02:00') + INTERVAL 1 DAY 

注意,这种形式的WHERE子句允许对createDate列上的索引进行范围扫描。这对性能非常好。

 类似资料:
  • 问题内容: 我正在尝试为我的应用程序修改golang时区 我看了一下 时间 包,初始化时区发生在 time / zoneinfo_unix.go @ initLocal 该函数只是尝试读取环境变量,如果有效,则将其加载 如果不是,它会回退,如果它无效,则会回退到 到目前为止我尝试过的 1-工作正常-但我不想使用任何一种方法-: 在我的docker文件中,我将ENV传递给了容器, 进入容器重击,运行

  • 问题内容: 如果函数需要修改在全局范围内声明的变量,则需要使用全局声明。但是,如果函数只需要读取全局变量,则可以不使用全局声明而这样做: 我的问题是关于Python的设计的:为什么Python被设计为允许在不使用全局声明的情况下读取全局变量?也就是说,为什么只强制分配具有全局性,为什么不强制全局读取呢?(这将使它变得均匀而优雅。) 注意:我可以看到在读取时没有歧义,但是在分配时并不清楚是否打算创建

  • 在提出问题之前,让我解释一下我的系统正在生产的当前场景: 我当前的服务器位于:EST,数据库位于:EST。 现在,有一个功能,我们希望为客户机引入时区支持,因此作为一项业务决策,我们已经将存储在Mysql中的所有数据(EST中的数据)迁移到UTC。 为什么是UTC,因为这是我们希望保留在系统中的基准或基本时区,并根据用户的时区将用户数据从UTC转换为特定时区。为了进行转换,我们将使用PHP Dat

  • 问题内容: 我在PHP中的select语句是 我使用以下PHP语句显示MySQL字段的日期和时间。 结果像这样 我想以以下格式查看结果 我想以以下格式查看结果 没有定义任何额外的功能。我只能修改我的echo语句。 我也可以修改我的选择语句。 问题答案: 您可以按照Frank Heikens在其答案中显示的那样直接在数据库中进行格式化,也可以在PHP中进行格式化。使用以下命令将mySQL日期值转换为

  • 我有表“Giorno”,我想改变它,但没有显示列,我甚至不能添加一个新列,因为现有的列也没有显示,下面的截图: 我还试图创建一个新表,但它出现了相同的bug。所以我不能添加新列。

  • 我在读关于Android编程中的TextWatcher的文章。我无法理解和之间的区别。 虽然我提到了TextWatcher的onTextChanged、beforeTextChanged和postTextChanged之间的差异,但我仍然无法想到需要使用而不是的情况。