【发布时间】:2018-08-02 16:44:26
【问题描述】:
我正在使用 Oracle SQL。我正在尝试使用 sysdate with time 来给我查询结果。我在 where 子句中放置了一个时间,但我需要它是自动的,并且使用 sysdate 并转换为本地时间是正确的方法。有什么想法吗?
SELECT RESOURCE, AVG(SALES) AS SALES
FROM Z_HOURLY_RESOURCE
WHERE DATE_TIME_START BETWEEN to_date(to_char(FROM_TZ( CAST( (to_date('2018-08-02T05:00:00','yyyy-MM-dd"T"HH24:mi:ss') )AS TIMESTAMP ), 'America/Los_Angeles') AT TIME ZONE 'UTC', 'yyyy-MM-dd"T"HH24:mi:ss'),'yyyy-MM-dd"T"HH24:mi:ss')
AND to_date(to_char(FROM_TZ( CAST( (to_date('2018-08-02T13:00:00','yyyy-MM-dd"T"HH24:mi:ss')+1) AS TIMESTAMP ), 'America/Los_Angeles') AT TIME ZONE 'UTC', 'yyyy-MM-dd"T"HH24:mi:ss'),'yyyy-MM-dd"T"HH24:mi:ss')
【问题讨论】:
-
DATE_TIME_START是什么数据类型 - 听起来像是代表 UTC 时间的日期或时间戳,对吗?如果您希望查询基于当前日期,您想要什么时间范围(本地 - 那么什么时区;或 UTC)?示例数据和预期结果也可能会有所帮助 - 作为格式化文本,而不是图像。 -
DATE_TIME_START 是一个时间戳 (6)。我希望时间范围是洛杉矶时间当地时间早上 5 点到下午 1 点。
-
所以该列的值代表洛杉矶的时间?参考当地时间和特定时区有点令人困惑。数据库服务器也在洛杉矶时间吗?
-
不,服务器在法国,这就是为什么 sysdate 基于 UTC。所以我需要将日期和时间转换为 LA 时间,但要使用时间范围。如果我可以更正我想要实现的日期格式,我的问题中指定的列具有值。如果我运行我示例的代码,它运行良好,结果很好。
-
为什么服务器在法国这一事实表明
sysdate以UTC 格式返回值?sysdate取决于操作系统时间和时区,在法国通常是 CET/CEST。