我有一個類似如下的查詢。
select some_date_col, count(*) as cnt
from <the table>
group by some_date_col
我在輸出中得到類似的東西。
13-12-2021, 6
13-12-2021, 8
13-12-2021, 9
....
這怎么可能?這里some_date_col是型別Date。
uj5u.com熱心網友回復:
ADATE是由 7 個位元組(世紀、世紀年、月、日、小時、分鐘和秒)組成的二進制資料型別,并且始終具有這些組件。
您用于訪問資料庫的用戶界面可以選擇顯示 的二進制表示的部分或全部組件DATE;但是,無論是否通過 UI顯示,所有組件始終存盤在資料庫中,并用于查詢中的比較。
當您GROUP BY使用日期資料型別時,您將具有相同值的值聚合到一秒的精度(無論用戶界面的精度如何)。
所以,如果你有資料:
CREATE TABLE the_table (some_date_col) AS
SELECT DATE '2021-12-13' FROM DUAL CONNECT BY LEVEL <= 6 UNION ALL
SELECT DATE '2021-12-13' INTERVAL '1' SECOND FROM DUAL CONNECT BY LEVEL <= 8 UNION ALL
SELECT DATE '2021-12-13' INTERVAL '1' MINUTE FROM DUAL CONNECT BY LEVEL <= 9;
然后查詢:
SELECT TO_CHAR(some_date_col, 'YYYY-MM-DD HH24:MI:SS') AS some_date_col,
count(*) as cnt
FROM the_table
GROUP BY some_date_col;
將輸出:
SOME_DATE_COL 碳納米管 2021-12-13 00:01:00 9 2021-12-13 00:00:01 8 2021-12-13 00:00:00 6
這些值根據相等的值(直到日期中存盤的最大精度)進行分組。
如果要GROUP BY使用相同的日期組件但任何時間組件進行日期,請使用TRUNCate 函式(它回傳具有相同日期組件但時間組件設定為午夜的值):
SELECT TRUNC(some_date_col) AS some_date_col,
count(*) as cnt
FROM <the table>
GROUP BY TRUNC(some_date_col)
其中,對于相同的資料輸出:
SOME_DATE_COL 碳納米管 21 年 12 月 13 日 23
和:
SELECT TO_CHAR(TRUNC(some_date_col), 'YYYY-MM-DD HH24:MI:SS') AS some_date_col,
count(*) as cnt
FROM the_table
GROUP BY TRUNC(some_date_col)
輸出:
SOME_DATE_COL 碳納米管 2021-12-13 00:00:00 23
db<>在這里擺弄
uj5u.com熱心網友回復:
Oracle 日期型別包含日期和時間組件。如果時間分量不匹配,則按該值分組會將相同的日期(具有不同的時間)放在不同的組中:
小提琴
CREATE TABLE test ( xdate date );
INSERT INTO test VALUES (current_date);
INSERT INTO test VALUES (current_date INTERVAL '1' MINUTE);
使用默認顯示格式:
SELECT xdate, COUNT(*) FROM test GROUP BY xdate;
結果:
| 日期 | 數數(*) |
|---|---|
| 21 年 12 月 13 日 | 1 |
| 21 年 12 月 13 日 | 1 |
現在改變格式并重新運行:
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MON-DD HH24:MI:SS';
SELECT xdate, COUNT(*) FROM test GROUP BY xdate;
結果
| 日期 | 數數(*) |
|---|---|
| 2021-DEC-13 23:29:36 | 1 |
| 2021-DEC-13 23:30:36 | 1 |
也試試這個:
SELECT to_char(xdate, 'YYYY-MON-DD HH24:MI:SS') AS formatted FROM test;
結果:
| 格式化 |
|---|
| 2021-DEC-13 23:29:36 |
| 2021-DEC-13 23:30:36 |
還有這個:
SELECT to_char(xdate, 'YYYY-MON-DD HH24:MI:SS') AS formatted, COUNT(*) FROM test GROUP BY xdate;
結果:
| 格式化 | 數數(*) |
|---|---|
| 2021-DEC-13 23:29:36 | 1 |
| 2021-DEC-13 23:30:36 | 1 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/383582.html
上一篇:帶有關鍵引數的min函式來搜索日期-有沒有更快的方法?
下一篇:如何使日期成為資料框中的列
