簡體   English   中英

如何從Oracle中的日期中提取月份數

[英]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”存儲,其中

  • yyyy 是年份
  • mm 月份
  • 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM