Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tạo phạm vi phút (15) được chọn

Nếu bạn đang bắt đầu với một giá trị ngày hoặc trong trường hợp này là một giá trị đã được chuyển đổi thành một ngày, bạn có thể tìm thấy khối 15 phút trong ngày mà nó thuộc về số giây sau nửa đêm; mà bạn có thể lấy từ to_char() với SSSSS mô hình định dạng.

select to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS') as now_time,
  to_char(sysdate, 'SSSSS') as now_secs
from dual;

NOW_TIME            NOW_S
------------------- -----
2015-06-18 18:25:49 66349

Bạn có thể làm tròn số giây xuống đầu khoảng thời gian 15 phút bằng cách chia cho 900 (15 * 60), cắt bớt hoặc xếp sàn để nhận giá trị số nguyên và nhân lại với 900:

select to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS') as now_time,
  to_char(sysdate, 'SSSSS') as now_secs,
  to_number(to_char(sysdate, 'SSSSS'))/900 as calc1,
  floor(to_number(to_char(sysdate, 'SSSSS'))/900) as calc2,
  floor(to_number(to_char(sysdate, 'SSSSS'))/900) * 900 as calc3
from dual;

NOW_TIME            NOW_S      CALC1      CALC2      CALC3
------------------- ----- ---------- ---------- ----------
2015-06-18 18:25:49 66349 73.7211111         73      65700

Và bạn có thể chuyển đổi nó trở lại thời gian bằng cách thêm nó trở lại một ngày:

select to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS') as now_time,
  to_char(sysdate, 'SSSSS') as now_secs,
  floor(to_number(to_char(sysdate, 'SSSSS'))/900) * 900 as calc3,
  to_char(date '1970-01-01'
    + (floor(to_number(to_char(sysdate, 'SSSSS'))/900) * 900 / 86400),
    'HH24:MI:SS') as calc4
from dual;

NOW_TIME            NOW_S      CALC3 CALC4  
------------------- ----- ---------- --------
2015-06-18 18:25:49 66349      65700 18:15:00

Mặc dù vậy, bạn có thể muốn giữ nguyên ngày, vì vậy bạn có thể thêm nó vào trunc(<original_date>) thay vì. Tôi cho là trừ khi bạn chỉ có dữ liệu trong một ngày hoặc muốn hiển thị cùng một thời điểm từ nhiều ngày được nhóm lại với nhau.

Đây là bản trình diễn với 10 lần được tạo ngẫu nhiên, hiển thị khối 15 phút mà chúng được chỉ định:

with t (date_field) as (
  select sysdate - dbms_random.value(0, 1)
  from dual
  connect by level <= 10
)
select to_char(date_field, 'YYYY-MM-DD HH24:MI:SS') as datefield,
  to_char(date_field, 'SSSSS') as time_secs,
  floor(to_number(to_char(date_field, 'SSSSS'))/900) * 900
    as fifteen_min_block_secs,
  to_char(trunc(date_field)
    + (floor(to_number(to_char(date_field, 'SSSSS'))/900) * 900) / 86400,
    'YYYY-MM-DD HH24:MI:SS') as fifteen_min_block
from t
order by datefield;

DATEFIELD           TIME_ FIFTEEN_MIN_BLOCK_SECS FIFTEEN_MIN_BLOCK 
------------------- ----- ---------------------- -------------------
2015-06-17 21:03:00 75780                  75600 2015-06-17 21:00:00
2015-06-18 05:07:28 18448                  18000 2015-06-18 05:00:00
2015-06-18 05:48:42 20922                  20700 2015-06-18 05:45:00
2015-06-18 07:23:03 26583                  26100 2015-06-18 07:15:00
2015-06-18 08:24:57 30297                  29700 2015-06-18 08:15:00
2015-06-18 08:52:06 31926                  31500 2015-06-18 08:45:00
2015-06-18 10:59:14 39554                  38700 2015-06-18 10:45:00
2015-06-18 11:47:05 42425                  42300 2015-06-18 11:45:00
2015-06-18 12:08:37 43717                  43200 2015-06-18 12:00:00
2015-06-18 17:07:23 61643                  61200 2015-06-18 17:00:00

Vì vậy, bạn cần phải có

trunc(date_field)
  + (floor(to_number(to_char(date_field, 'SSSSS'))/900) * 900) / 86400

hoặc đơn giản hơn một chút

trunc(date_field)
  + floor(to_number(to_char(date_field, 'SSSSS'))/900) / 96

tham gia vào nhóm group by và có thể trong danh sách lựa chọn của bạn để hiển thị.

Giả sử T2318.C3 là giây kể từ kỷ nguyên, bạn có thể thao tác trực tiếp và sau đó chuyển nó vào secs_to_datetime của bạn chức năng:

secs_to_datetime(floor(T2318.C3 / 900) * 900)

Vì vậy, bản trình diễn tương đương với bản trình diễn ở trên, một lần nữa với mười lần được tạo ngẫu nhiên trong một CTE, sẽ là:

with T2318(c3) as (
  select 1434708000 - dbms_random.value(0, 80000) from dual
  connect by level <= 10
)
select to_char(secs_to_datetime(T2318.C3),'DD/MM/YYYY HH24:MI:SS') as datefield,
  T2318.C3 as time_secs,
  floor(T2318.C3/900) * 900 as fifteen_min_secs,
  to_char(secs_to_datetime(floor(T2318.C3 / 900) * 900),
    'DD/MM/YYYY HH24:MI:SS') as fifteen_min
from T2318
order by T2318.C3;

DATEFIELD              TIME_SECS FIFTEEN_MIN_SECS FIFTEEN_MIN       
------------------- ------------ ---------------- -------------------
18/06/2015 12:34:02   1434630842       1434630600 18/06/2015 12:30:00
18/06/2015 15:06:25   1434639985       1434639600 18/06/2015 15:00:00
18/06/2015 16:43:27   1434645807       1434645000 18/06/2015 16:30:00
18/06/2015 18:57:25   1434653845       1434653100 18/06/2015 18:45:00
18/06/2015 19:01:09   1434654069       1434654000 18/06/2015 19:00:00
18/06/2015 20:54:09   1434660849       1434660300 18/06/2015 20:45:00
19/06/2015 03:59:48   1434686388       1434685500 19/06/2015 03:45:00
19/06/2015 06:58:09   1434697089       1434696300 19/06/2015 06:45:00
19/06/2015 07:36:36   1434699396       1434699000 19/06/2015 07:30:00
19/06/2015 07:47:26   1434700046       1434699900 19/06/2015 07:45:00

Hoặc nếu tính bằng mili giây, hãy chia và nhân với 900000.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ví dụ về giao dịch tự trị của Oracle

  2. Oracle có hỗ trợ tìm kiếm toàn văn không?

  3. Làm thế nào để sử dụng Partition By hoặc Max?

  4. Cơ sở dữ liệu CodeIgniter và Oracle - ActiveRecord insert () đang thêm dấu ngoặc kép trong truy vấn

  5. Quy trình chặn PL / SQL với Oracle