[SAP ABAP開發技術總結]日期函數


 

21.1.     日期函數

21.1.1.           日期、時間驗證

DATE_CHECK_PLAUSIBILITY:檢查一個日期是否是有效格式,如果不是有效日期,則報異常:

CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
 
EXPORTING
   
date                      = '20110229'
 
EXCEPTIONS
    plausibility_check_failed
= 1
   
OTHERS                    = 2.
IF sy-subrc <> 0.
ENDIF.

TIME_CHECK_PLAUSIBILITY:時間有效性檢查,與上面日期有效性檢查使用方式相同

21.1.2.           內部轉換外部格式

FORMAT_DATE_4_OUTPUT將數據庫中8位的日期(YYYYMMDD)轉換為指定的任意格式

image475

image476

注意:在程序中,日期格式要使用大寫格式。

 

CONVERT_DATE_TO_EXTERNAL將數據庫中的8內部日期(YYYYMMDD)以當前Client設置的外部日期格式顯示:

image477

21.1.3.           外部轉內部格式

CONVERT_DATE_TO_INTERNAL將外部日期(要符合Client設置的日期格式)轉換為數據庫內部日期(YYYYMMDD

INPUT:      02/03/2008    "Should be same as the user's default setting

OUPUT:     20080203

CONVERT_DATE_INPUT將外部日期(要符合Client設置的日期格式)轉換為數據庫內部日期

DATA: d TYPE d.
CALL FUNCTION 'CONVERT_DATE_INPUT'
 
EXPORTING
   
input                     = '2011.10.18'
    plausibility_check       
= 'X'"進行日期有效性驗證
 
IMPORTING
   
output                    = d
 
EXCEPTIONS

    plausibility_check_failed
= 1
    wrong_format_in_input    
= 2
   
OTHERS                    = 3.

image478

21.1.4.           獲取Client格式

獲取當前Client端的日期格式與時間格式:

SELECT datfm INTO lv_datfm FROM usr01 UP TO 1 ROWS WHERE bname = zname . ENDSELECT.

image479 

image480 image481

21.1.5.           日期加減

RP_CALC_DATE_IN_INTERVAL加減自然年、自然月,還可以加減天數(一般加多少天直接通過日期類型就加減就可以了,但如果向下面那樣需要在20070101加上11個月零28天時,就很有用了):

image482

21.1.6.           轉成工廠日期

DATE_CONVERT_TO_FACTORYDATE:如果輸入的是周末與公共節假日,則將它把調整為工廠日歷日期(工作日期):

DATA: date        LIKE scal-date,
      factorydate 
LIKE scal-facdate,
      workday     
LIKE scal-indicator.
CALL FUNCTION 'DATE_CONVERT_TO_FACTORYDATE'
 
EXPORTING
"如果輸入的日期不是工作日,則是該函數會返回離該輸入的節假日前或者后面的最近的工作日,是返回前面還是后面由  +/- 來決定    +:返回后面最近的工作日 -:返回前面最近的工作日默認就是+
*   CORRECT_OPTION                     = '+'
   
date                               = '20111119'
"使用的工廠日歷ID,可以從
 T001W-FABKL 中獲取
    factory_calendar_id               
= 'CN'
 
IMPORTING
"如果輸入的是節假日,則返回是經過轉換過了的工作日;如果輸入的就是工作時,則返回的是自身,格式為 YYYYMMDD
  
date                               = date
"返回的工作日在指定的工作日歷中位於第幾個工作日,一般對我們沒什么作用
   factorydate                       
= factorydate
"
標示返回的DATE是否是工作日,如果為空,則是,如果為 + ,表示返回的是輸入的節假日后面最近一個工作;如果為 - ,表示返回的是輸入的節假日前面最近一個工作日。
   workingday_indicator              
= workday.
WRITE:/ date , factorydate, workday.

 

其中工廠日歷的代碼按工廠號到表T001W上取:

SELECT SINGLE fabkl INTO l_fabkl FROM t001w  WHERE werks = im_mt61d-werks.

 

FACTORYDATE_CONVERT_TO_DATE該函數可以將DATE_CONVERT_TO_FACTORYDATE返回的factorydate(工作日序號:工作日在指定的工作日歷中位於第幾個工作日)轉換成工作日,也可以用在“加幾個工作日”的應用中:比如給某個時間加上幾個工作日時,可以先使用DATE_CONVERT_TO_FACTORYDATE函數將某個時間轉換為工廠日期,並獲取factorydate工作日序號,再在這個工作日序號上加上幾個工作日,得到新的工作日序號,然后再將這個新的工作日序號傳遞給FACTORYDATE_CONVERT_TO_DATE函數,得到最終的新的工作日期:

image483

工廠日歷定義表為TFACD(節假日歷定義表THOCD),表里存儲了工廠日歷IDTFACD-IDENT)與節假日歷IDTFACD-HOCID)的關系,所以只要知道了工廠日歷ID,則要使用節假日歷ID則可以查詢出來(注:工廠日歷ID還可以通過T001W來查詢得到):

image484

工廠日歷相關表是以“TFA”開頭的表,節假日歷相關的表是以“THO”開頭相關的表

21.1.7.           日期屬性

DAY_ATTRIBUTES_GET查看某日期的屬性(休息日、節假日、星期幾):

CALL FUNCTION 'DAY_ATTRIBUTES_GET'
 
EXPORTING
   FACTORY_CALENDAR                
= 'CN'引用表字段TFACD-IDENT
*   HOLIDAY_CALENDAR                 = ' '引用表字段THOCI-IDENT
   DATE_FROM                       
= '20110428'
   DATE_TO                         
= '20110510'
*   LANGUAGE                         = SY-LANGU
*   NON_ISO                          = ' '
* IMPORTING
*   YEAR_OF_VALID_FROM               =
*   YEAR_OF_VALID_TO                 =
*   RETURNCODE                       =
 
TABLES
    day_attributes                  
= attr .
image485

image486 image487

21.1.8.           節假日

HOLIDAY_CHECK_AND_GET_INFO判斷某天是否是假日,並且可以返回該日期所對應的節假日信息。

DATA attr TYPE casdayattr OCCURS 0.
DATA: is_hol .
DATA: THOL TYPE THOL OCCURS 0.
CALL FUNCTION 'HOLIDAY_CHECK_AND_GET_INFO'
 
EXPORTING
   
date                               = '20100529'
    holiday_calendar_id               
= 'Z1'
   
"需要返回節假日屬性內表信息
   with_holiday_attributes           
= 'X'
 
IMPORTING
  
"
是否節假日(注:周末不是節假日,但是一種休息日
   holiday_found                     
is_hol
  
"Attributes of the found public holidays The table contains

  
"the holiday aAttributes, if the specified date is a holiday.
  
"The attributes must be passed in a table because several
  
"holidays can fall on a date.即一天有可能有兩個節,所以需要使用內表接收
 
TABLES
   holiday_attributes                
= THOL.

21.1.9.           年月選擇框

POPUP_TO_SELECT_MONTH彈出一個對話框顯示月份和年度下拉列表,讓用戶選擇年與月

image488

輸入:
ACTUAL_MONTH
          當前月份(彈出框中的默認值),必須填寫。形式為 YYYYMM
FACTORY_CALENDAR
工廠日歷,可以省略,默認值為空。更多信息請參考表 TFACD
HOLIDAY_CALENDAR
   公共假日日歷,可以省略,默認值為空。更多信息請參考表 THOCI
LANGUAGE
                   語言,可以省略。用來指定月份名稱用哪種語言顯示,不指定就是當前登錄語言。
START_COLUMN
          彈出對話框出現的位置,列,可以省略,默認值為 8
START_ROW
                 彈出對話框出現的位置,行,可以省略,默認值為 5
輸出:
SELECTED_MONTH
     選擇的月份,如果按了取消按鈕,則值為 000000
RETURN_CODE
            返回碼,如果按了取消按鈕,則值為 4,否則為 0


說明:工廠日歷和公共假日日歷主要用來限制下拉列表中的可選年份范圍。如果不指定,就是當前年前后各 50 年,共 100

21.1.10.      財政年

GET_CURRENT_YEAR得到當前的財政年(fiscal year

21.1.11.      星期翻譯對照表

WEEKDAY_GET從數據表中獲得指定語言每周七天的名稱,例如中文就是星期一、星期二……星期日,英文就是SundayMonday……Saturday

image489

輸入參數:

LANGUAGE:指定語言代碼,可以省略,如果不填就是當前登錄語言。注意,在調用時如果指定某種特定語言,必須用一個字節的語言代碼,例如中文是 1、英文是 E……,而不能用 ZHEN,語言代碼參見表 T002
輸出內表:WEEKDAY:結構與透明表 T246
相同,用來存儲返回給用戶的周日名稱。

21.1.12.      日期所在周末、天/周、周/

HR_GBSSP_GET_WEEK_DATES獲得某個日期所在周的周六周日、所在周的第幾天、所在年的第幾周:

image490

輸入參數:
P_PDATE
:一個日期,必須填寫。
輸出參數:
P_SUNDAY
:該周的周日,在 SSP 日期系統中,周日為第一天。
P_SATURDAY
:該周的周六,在 SSP 日期系統中,周六為最后一天。
P_DAY_IN_WEEK
:輸入日期在當周的第幾天,周日第 1 天,周一第 2 天,依此類推,周六第 7 天。
P_WEEK_NO
:該周是年度的第幾周。6 位數字,格式為 YYYYWW,前四位是年,后兩位是周。
說明:SSP Statutory Sick Pay
的縮寫

 

該函數包括了以下兩個函數的功能:

DATE_GET_WEEK獲得某個日期所在的周

image491

image492

WEEK_GET_FIRST_DAY計算某周的第一天(如下面的1999年的第52周第一天):

image493

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM