【问题标题】:SQL TRUNC Minutes from Sysdate来自 Sysdate 的 SQL TRUNC 分钟
【发布时间】:2018-06-02 06:52:45
【问题描述】:

我目前正在使用其中一列来提取每一分钟的时间,但是,它会跳过几分钟,因为那一分钟没有插入数据。

输出低于预期。

12-19-2017 02:23:00
12-19-2017 02:24:00
12-19-2017 02:25:00
12-19-2017 02:26:00
12-19-2017 02:27:00
12-19-2017 02:28:00
12-19-2017 02:29:00
12-19-2017 02:30:00
12-19-2017 02:31:00
12-19-2017 02:32:00
12-19-2017 02:33:00
12-19-2017 02:34:00

我得到了什么。(当前时间是 13:11

12-19-2017 13:11:00
12-19-2017 13:11:00
12-19-2017 13:11:00
12-19-2017 13:11:00
12-19-2017 13:11:00
12-19-2017 13:11:00
12-19-2017 13:11:00
12-19-2017 13:11:00
12-19-2017 13:11:00
12-19-2017 13:11:00
12-19-2017 13:11:00
12-19-2017 13:11:00

查询

SELECT TRUNC(SYSDATE,'MI')  AS TIME_STAMP From Table where SYSDATE >= sysdate - 1;

【问题讨论】:

  • 您使用的是哪个 dbms?该查询是特定于产品的。
  • @jarlh Oracle RDBMS
  • 那你想要什么?以一分钟为步长的日期和时间列表,即使表格中不存在某些分钟,对吗?
  • From Table?什么表? 了解您自己的问题吗?
  • @Dmitry 是的,就是这样。有些分钟不存在,这就是为什么我想像你所说的那样使用 Sysdate 提取所有分钟。

标签: sql oracle datetime timestamp sysdate


【解决方案1】:

如果我的开始时间是从昨天午夜到现在,那么我想查看每分钟的输出。

如果您想根据 sysdate 生成一系列值,那么您可以对 dual 表使用分层查询,而不必参考真实表:

select trunc(sysdate - 1) + (level - 1)/1440 as result
from dual
connect by level <= (sysdate - trunc(sysdate - 1))*1440
order by result;

RESULT
-------------------
2017-12-18 00:00:00
2017-12-18 00:01:00
2017-12-18 00:02:00
2017-12-18 00:03:00
...
2017-12-18 23:57:00
2017-12-18 23:58:00
2017-12-18 23:59:00
2017-12-19 00:00:00
2017-12-19 00:01:00
2017-12-19 00:02:00
2017-12-19 00:03:00
...
2017-12-19 14:21:00
2017-12-19 14:22:00
2017-12-19 14:23:00

这里使用trunc(sysdate - 1)获取昨天的午夜作为起点;计算当时和现在之间的分钟数为(sysdate - trunc(sysdate - 1))*1440);并使用 connect-by 语法将开始时间增加一分钟,直到达到该限制。

(取决于当前分钟,但不包括当前分钟。如果您也想要,只需在终止条件的末尾添加 1。)

根据您真正想要的最终结果,您可以将其用作 CTE 或内联视图来生成所有这些分钟,然后左连接到您的真实表以查找匹配的数据(如果存在)。


如果您希望用户提供开始和结束时间,您可以将它们作为变量传递,例如:

select trunc(:start_time, 'MI') + (level - 1)/1440 as result
from dual
connect by level <= (:end_time - :start_time)*1440
order by result;

这里的:start_time:end_time 是您使用开始和结束时间填充的绑定变量。确切的机制取决于值如何从用户获取到查询;在 SQL*Plus 或 SQL Developer 工作表中,您需要将它们作为字符串获取,并将这些字符串(显式)转换为日期。从 Java 应用程序说您可以直接绑定日期数据类型。

【讨论】:

  • 这正是我要找的,你太棒了。谢谢
  • 一个问题,我可以使用来自 Dual 的。如何添加 where 子句让用户选择 RESULT 的开始和结束时间?
  • @user206168 - 我已经添加了一个关于如何做到这一点的简要想法。如果不清楚,那么您应该提出一个新问题,包括用户如何输入数据以及到达查询时它是什么数据类型。
  • 亚历克斯,你能帮忙吗?我收到用户输入的日期和时间错误。我的查询就像select trunc(to_char('03-12-2018 00:00:00','MM-DD-YYYY HH24:MI:SS') - 3) + (level - 1)/1440 as CLOCK 和错误是在我在不同的能力上做的左连接。 where startdatetime &gt;= TO_DATE('03-12-2018 00:00:00','MM-DD-YYYY HH24:MI:SS') group by trunc(restoredatetime,'MI')ORA-00932: inconsistent datatypes: expected NUMBER got DATE 00932. 00000 - "inconsistent datatypes: expected %s got %s"
  • 您需要提出一个新问题,并提供所有详细信息。但是您似乎使用的是to_char() 而不是to_date()
【解决方案2】:

问题是:您总是从表中为今天的所有行选择相同的时间(sysdate)

SELECT trunc(sysdate,'mi')  as time_stamp
  FROM myTable 
 WHERE sysdate >= sysdate - 1;

尝试将查询重写为:

SELECT to_char(date1,'mm-dd-yyyy hh:mi:ss')  as time_stamp
  FROM myTable 
 WHERE sysdate >= sysdate - 1; 
-- assuming you have a date column named DATE1 in your table, and populated every minute.

(比较小时 0213,我决定使用 hh 而不是 hh24 进行格式化)

【讨论】:

  • 对不起,我应该提到 24 小时制时钟并不重要。我无法从SYSDATE 中提取每一分钟。例如,如果我的开始时间是从昨天午夜到现在,那么我想查看每分钟的输出。
  • @user206168 我认为您有一个表格并且其中一个日期列已被填充,不是吗?你能分享一下你的表格结构吗?
猜你喜欢
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 2012-08-17
  • 2012-05-31
  • 2020-02-16
  • 2019-01-12
  • 2021-01-16
  • 1970-01-01
相关资源
最近更新 更多