[英]Oracle — Pulling monthly data based on varchar timestamp
我有一個 oracle 數據庫,我正在嘗試按月從中提取數據。
我正在查詢的表和字段具有以下結構
select ID, lastmodifieddate as LMDate from salesforce.X_TASK WHERE ROWNUM <= 10
('ID', <cx_Oracle.DbType DB_TYPE_VARCHAR>, 18, 18, None, None, 1)
('LMDATE', <cx_Oracle.DbType DB_TYPE_VARCHAR>, 25, 25, None, None, 1)
('00T4N00002QhFvjUAF', '2019-09-06T21:05:04.000Z')
('00T4N00002QhFvmUAF', '2019-09-06T21:05:04.000Z')
('00T4N00002QhFvnUAF', '2019-09-06T21:05:04.000Z')
('00T4N00002QhFvsUAF', '2019-09-06T21:05:04.000Z')
('00T4N00002QhFvtUAF', '2019-09-06T21:05:04.000Z')
('00T4N00002QhFw0UAF', '2019-09-06T21:05:04.000Z')
('00T4N00002QhFw1UAF', '2019-09-06T21:05:04.000Z')
('00T4N00002QhFwAUAV', '2019-09-06T21:05:09.000Z')
('00T4N00002QhFwBUAV', '2019-09-06T21:05:09.000Z')
('00T4N00002QhFwMUAV', '2019-09-06T21:05:09.000Z')
僅從 varchar 時間戳字段中提取日期的最佳方法是什么?
我嘗試將字段更改為_char
select ID, to_char(LASTMODIFIEDDATE, 'YYYY-MM-DD') from salesforce.X_TASK
WHERE LASTMODIFIEDDATE >= to_date('2020-05-31', 'YYYY-MM-DD')
and LASTMODIFIEDDATE < to_date('2020-06-30', 'YYYY-MM-DD')
但最終出現此錯誤
ORA-01861: literal does not match format string
如果我嘗試將其更改為日期,則相同
select ID, to_date(LASTMODIFIEDDATE, 'YYYY-MM-DD') from salesforce.X_TASK
WHERE LASTMODIFIEDDATE >= to_date('2020-05-31', 'YYYY-MM-DD')
and LASTMODIFIEDDATE < to_date('2020-06-30', 'YYYY-MM-DD')
ORA-01861: literal does not match format string
究竟什么是“時間戳”? 它看起來怎樣? 日期、時間到...秒?
無論如何:因為您將時間戳存儲為字符串(通常是壞主意),並且如果它的所有值共享相同的格式(例如25.02.2021 20:02:00
即dd.mm.yyyy hh24:mi:ss
),那么最簡單的方法是使用SUBSTR
function。 在你的情況下:
select id,
substr(lastmodifieddate, 1, 10) as datum
from salesforce.X_TASK
where to_date(lastmodifieddate, 'dd.mm.yyyy') >= to_date('2020-05-31', 'YYYY-MM-DD')
and to_date(lastmodifieddate, 'dd.mm.yyyy') < to_date('2020-06-30', 'YYYY-MM-DD');
當然,如果格式不是dd.mm.yyyy
(如我的示例),你會使用你的。 請注意,如果存在不遵循這種格式的值,包含字母等,查詢將失敗。 這就是為什么我說將時間戳(或日期)存儲為字符串是一個壞主意。
閱讀您的評論后:似乎該列包含大量數據,而不僅僅是時間戳。 好的然后 - 從中提取日期片段。 SUBSTR + INSTR
會做:
SQL> with test (col) as
2 (select q'[<cx_Oracle.DbType DB_TYPE_VARCHAR>, 25, 25, None, None, 1) ('2016-10-27T19:27:14.000Z')]'
3 from dual
4 )
5 select substr(col, instr(col, '(') + 2, 10) datum
6 from test
7 /
DATUM
----------
2016-10-27
SQL>
現在,使用適當的格式掩碼對其應用TO_DATE
並在WHERE
子句中使用它:
select id,
to_date(substr(lastmodifieddate, instr(lastmodifieddate, '(') + 2, 10), 'yyyy-mm-dd') datum
from x_task
where to_date(substr(lastmodifieddate, instr(lastmodifieddate, '(') + 2, 10), 'yyyy-mm-dd') >= to_date('2020-05-31', 'YYYY-MM-DD')
and to_date(substr(lastmodifieddate, instr(lastmodifieddate, '(') + 2, 10), 'yyyy-mm-dd') < to_date('2020-06-30', 'YYYY-MM-DD');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.