选择时间戳之间的数据



用例:查询以选择一整天的记录,它应该定期运行。

这是我的疑问。

Select to_char(in_date + interval '12' hour, 'DD-MON-YYYY HH24:MI:SS') 
from my_table 
where incoming_date > sysdate-2 and incoming_date < sysdate

我只需要选择昨天的数据。由于select语句中的转换,我也得到了今天的数据。如何只选择昨天的数据?我的数据库采用UTC+7.00标准。我需要在本地标准中显示它,以便在select语句中进行转换。如何只显示昨天的数据?我被卡住了。请帮我

要获取昨天的所有数据,应该使用

SELECT TO_CHAR(IN_DATE + INTERVAL '12' HOUR, 'DD-MON-YYYY HH24:MI:SS')
FROM MY_TABLE
WHERE INCOMING_DATE BETWEEN TRUNC(SYSDATE) - INTERVAL '1' DAY
AND TRUNC(SYSDATE) - INTERVAL '1' SECOND

例如,如果SYSDATE为2017年11月5日18:56:35,则BETWEEN比较中使用的时间间隔将为2017年4月4日00:00:00至2017年11日4日23:59:59。BETWEEN比较包括两个端点,因此在本例中,它只会在2017年11月4日的某个时间返回INCOMING_DATE的数据。

祝你好运。

只获取

昨天的数据

作为的WHERE条件

incoming_date between trunc(sysdate) - interval '1' day and trunc(sysdate) - interval '1' second

我的数据库采用UTC+7.00标准。我需要在本地标准中显示它,以便在select语句中进行转换。

使用魔术值(INTERVAL '12' HOUR)不会描述它的含义,也不会描述您在选择该值时所做的假设。相反,您可以使用FROM_TS( timestampvalue, timezonestring )将值从TIMESTAMP转换为TIMESTAMP WITH TIME ZONE数据类型,然后使用AT LOCAL TIME将其转换为本地时间,从而更好地描述该过程。然后,如果您有夏令时或将查询移植到另一个国际位置,则它仍将以当前本地时间显示。像这样:

SELECT TO_CHAR(
FROM_TZ( CAST( in_date AS TIMESTAMP ), '+07:00' ) AT LOCAL TIME,
'DD-MON-YYYY HH24:MI:SS'
) 
FROM   my_table 
WHERE  incoming_date >= TRUNC( SYSDATE ) - INTERVAL '1' DAY
AND    incoming_date <  TRUNC( SYSDATE )

如何只显示昨天的数据?

TRUNC( SYSDATE )将把今天的日期截断回午夜。要获取昨天的数据,则可以获取大于或等于TRUNC( SYSDATE ) - INTERVAL '1' DAY(今天午夜前一天)且小于TRUNC( SYSDATE )(今天午夜)的值。

我不太确定我是否理解你的问题,但我想我可以解释一些东西。

我假设你的桌子有点像这样:

date_added | some_data | some_more_data 
------------|-----------|----------------
date       | data1     | data2

据我所知,您的目标是使用select语句获取在运行查询前一天添加到表中的所有行。但是您当前的尝试失败了,同时返回了今天的结果。

以下是正在发生的事情(我认为):
SYSDATE不仅会给你当前的日期,还会给你时间。你可以通过简单地更改当前会话并将日期/时间格式设置为同时包含时间和日期的格式来看到这一点

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';

获得今天的行的原因很简单,您的查询是询问日期字段在right nowright now - 24 hours之间的所有行。不是todaytoday - 24 hours

那么解决方案是什么呢
使用TRUNC函数将SYSDATE调整为当天
https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions201.htm

SELECT
T.*
FROM
MY_TABLE T
WHERE
T.DATE_ADDED BETWEEN (TRUNC(SYSDATE,'day') - 1) AND TRUNC(SYSDATE,'day');

正如您提到的时区一样,请记住SYSDATE返回的是服务器本身的日期,而不是您计算机的日期
点击此处了解更多信息:https://stackoverflow.com/a/17925834/7655979

通常我只使用Trunc来比较日期。

WHERE trunc(incoming_date) = trunc(sysdate-1)

最新更新