【问题标题】:Check opening hours in different timezones查看不同时区的营业时间
【发布时间】:2018-08-30 10:42:00
【问题描述】:

我的规格:

  • Postgres 9.6.6,最新的 Ubuntu LTS

  • 服务器时区为 GMT

  • 一个包含两列的表格,显示每个时区的商店开店和关店时间。

这是桌子:

ShopId      OpenAt           CloseAt
  1      09:00:00 -08     17:00:00 -08
  2      09:30:00 -05     17:30:00 -05
  3      08:00:00 -11     15:00:00 -11
  4      10:00:00 +07     15:30:00 +07

我需要知道的是,此时(在我当前的 GMT 时间),商店是否营业。考虑到周六和周日关闭。

我正在四处挖掘,我得到了类似的东西:

 SELECT ((OpenAt,CloseAt) OVERLAPS(NOW())) AND ISODOW < 6  

没有运气......

谢谢
佩雷斯

【问题讨论】:

  • 你试过 ((OpenAt,CloseAt) OVERLAPS(NOW(),NOW())) 和 EXTRACT (ISODOW FROM now())
  • SELECT (('09:00:00+03'::time, '17:00:00+03'::time) OVERLAPS(NOW(),NOW())) 和 EXTRACT (ISODOW FROM now()) 返回:CAST ERROR
  • 你不能比较时间和时间戳试试这个:SELECT ((date_trunc('day',now())+'09:00:00+03'::time, date_trunc('day ',now())+'17:00:00+03'::time) OVERLAPS(NOW(),NOW())) 和 EXTRACT (ISODOW FROM now())
  • 但是您可以将时间添加到实际日期:date_trunc('day',now)+'09:00:00+03':time
  • 它没有按预期工作,想象一下如果你现在在伦敦,你可能会得到 FALSE,但该查询返回 TRUE:SELECT ((date_trunc('day',now() )+'09:00:00+8'::time, date_trunc('day',now())+'16:00:00+8'::time) 重叠(NOW(),NOW()))

标签: postgresql timezone


【解决方案1】:

试试这个:

SELECT ((date_trunc('day',nowAtShopLocation)+"OpenAt"::time, date_trunc('day',nowAtShopLocation)+"CloseAt"::time) OVERLAPS(nowAtShopLocation,nowAtShopLocation)) and EXTRACT (ISODOW FROM nowAtShopLocation) <6
from (
  select *,now() AT TIME ZONE 'UTC'+(EXTRACT(TIMEZONE_HOUR FROM "OpenAt")||' hour')::interval nowAtShopLocation from your_table
) a

【讨论】:

  • 按预期工作。
  • 这似乎产生相同的结果,但更简单...SELECT (now()::time BETWEEN (OpenAt AT TIME ZONE 'UTC') AND (CloseAt AT TIME ZONE 'UTC')) AND EXTRACT (ISODOW FROM now()) &lt;6 FROM MyTable
  • 是的,这是 90% 的工作,但时区差异会导致当前服务器日期和用户当前日期不同。这不是您的要求处理的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-21
  • 2015-04-11
  • 2011-02-12
  • 2021-07-15
  • 1970-01-01
  • 2014-05-31
相关资源
最近更新 更多