SQL Sysdate 的 TRUNC 分钟数

SQL TRUNC Minutes from Sysdate

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

输出低于预期。

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;

问题是:对于

今天的所有行,您总是从 table 选择相同的时间 (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格式化)

if my starting time was from Yesterday midnight to now then I want to see output of each minute.

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

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 或内联视图来生成所有这些分钟,然后左连接到您的真实 table 以查找匹配数据如果它存在。


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

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 开发人员工作表中,您需要将它们作为字符串获取并添加(显式)将这些字符串转换为日期。从 Java 应用程序说你可以直接绑定日期数据类型。