[英]How to extract month number from date in Oracle
我有ID_BB_SECURITY
列,其中日期值存儲在此列中,例如'20190801'
。
我想從這個字段中獲取月份數,例如我想得到 8 的八月日期。
我試過下面的查詢,但它拋出一個錯誤“文字不匹配”:
select to_number(to_date(ID_BB_SECURITY),'mm') from BT_EXPORT
我不確定是否必須忽略空值以避免錯誤
如果該值是數字或字符串,那么您可以將其轉換為具有適當掩碼的日期 - 這就是您所缺少的,以及導致您收到錯誤的原因(因為它使用的是會話的NLS_DATE_FORMAT
設置,這顯然沒有匹配數據的格式;但無論如何你都不應該依賴它,正如@MTO 在評論中所說的那樣):
to_date(ID_BB_SECURITY, 'YYYYMMDD')
然后從中提取月份數:
select extract(month from to_date(ID_BB_SECURITY, 'YYYYMMDD')) from BT_EXPORT
或者你可以只使用一個子字符串:
select to_number(substr(ID_BB_SECURITY, 5, 2)) from BT_EXPORT;
那些假設是固定的一致格式,當使用錯誤的數據類型時,這總是一個冒險的假設。 Ans 如果它是一個數字,他們正在進行從數字到字符串的隱式轉換,為了更清晰,您可以將其轉換為顯式轉換。
如果它已經是一個日期 - 當然應該是 - 那么你不需要轉換:
select extract(month from ID_BB_SECURITY) from BT_EXPORT
如果你有一個數字,你可以使用算術來提取月份:
select mod(floor(20190801 / 100), 100)
from dual;
您可以嘗試將數字日期轉換為字符串,然后提取第 5 個和第 6 個字符:
SELECT
SUBSTR(TO_CHAR(ID_BB_SECURITY), 5, 2) AS mm
FROM BT_EXPORT;
但是,使用適當的日期列對您來說會好得多。 然后,您可以使用不那么嚴厲的方法,例如:
SELECT
TO_CHAR(ID_BB_SECURITY, 'mm') AS mm -- assuming date
FROM BT_EXPORT;
select to_number(to_char(to_date('20190801', 'yyyymmdd'), 'mm')) from dual
還
select extract(month from to_date('20190801', 'yyyymmdd')) from dual
試試這個
select extract(month from to_date(ID_BB_SECURITY, 'YYYYMMDD')) from BT_EXPORT
這一個將數字轉換為日期然后提取月份。
您的日期列的值以以下格式“yyyymmdd”存儲,其中
dd the day 所以為了返回月份的數值(mm)我們可以這樣做:
1:首先使用 to_date(20190801,'yyyymmdd') 將值從數字轉換為日期
2: 使用 to_date 運算符獲取月份 to_char( to_date(20190801,'yyyymmdd'), 'mm')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.