在时间戳之间选择数据

时间:2017-11-05 20:11:06

标签: sql oracle

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

这是我的疑问。

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语句中进行转换。而我如何仅显示昨天的数据? 我被卡住了。请帮帮我

5 个答案:

答案 0 :(得分:2)

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

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是05-NOV-2017 18:56:35,BETWEEN比较中使用的时间间隔将是04-NOV-2017 00:00:00至04-NOV-2017 23: 59:59。 BETWEEN比较包含两个端点,因此在此示例中,仅在04-NOV-2017的某个时间返回INCOMING_DATE的数据。

祝你好运。

答案 1 :(得分:1)

仅获得

  

昨天的数据

制作你的   WHERE 条件为

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

答案 2 :(得分:1)

  

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

使用魔术值(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 )(今天午夜前一天)且小于import os import xml.etree.ElementTree as ET xml_file = "c:/temp/test.xml" csv_file_output = '{}_out.csv'.format(os.path.splitext(xml_file)[0]) tree = ET.parse(xml_file) xml_root = tree.getroot() with open(csv_file_output, 'w') as fout: fout.write("Id,PostId,Score,Text") for row in xml_root.iter("row"): id = row.get("Id") postId = row.get("PostId") score = row.get("Score") text = row.get("Text") fout.write('\n{0},{1},{2},"{3}"'.format(id, postId, score, text)) (今天午夜)的值。

答案 3 :(得分:0)

我不确定我是否接受了你的问题,但我想我可以解释一些问题。

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

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

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

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

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

您今天获取行的原因很简单,您的查询要求所有date_added字段位于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

答案 4 :(得分:0)

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

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