# DATE_UDF - SQL **U**ser **D**efined **F**unctions to Convert a Legacy Date to a True Date Legacy databases on the IBM i stored dates in numeric (or character) fields. Doing validation or arithmetic on such fields was complex. IBM finally added a true date type to the database as Y2K approached. After Y2K, many of these dates still existed in databases. I developed these SQL UDFs to convert a legacy date to a true date, largely so I could do date arithmetic. For example: SELECT ... FROM CUSTMAST WHERE DATE_YMD(DUEDATE) <= CURDATE() - 9O DAYS The most common formats where month-day-year (in the USA) and year-month-day. Often there was no century included. There was also an IBM sanctioned format, CYMD, where the C was a 1-digit century, with 0 meaning 19, and 1 meaning 20. ## Development What these functions do can also be done, with some work, directly in SQL. And I'm aware there are other open source date UDFs avaliable, e.g. [iDate](https://www.think400.dk/downloads.htm). However... 1. When I wrote this I was not aware of any similar functions, and there may not have been any. (Though I probably got the idea from [Scott Klement](https://www.scottklement.com/udtf/)). 2. This is an efficient, light weight implementation in RPG. 3. Each function requires only 1 parameter and I like that convenience. 4. The code demonstrates creating an SQL UDF in RPG. ## Functions There are three functions,each taking a numeric field as input. *Note:* Newer versions of SQL will automatically cast character fields to numeric, otherwise you have to cast to numeric manually. * **DATE_YMD** to convert dates in either YYMMDD or CCYYMMD format. * Example: 980129 or 19980129. * Example: 210319 or 20210319 * **DATE_MDY** to convert dates in MMDDYY or MMDDCCYY format. * Example: 012998 or 01291998 * Example: 031921 or 03192021 * **DATE_CYMD** to convert dates in CYYMMDD format. * Example: 0990317 * Example: 1210317 ### Invalid Input An invalid input value will return a null value and give a 01H99 SQLSTATE warning. ## DATE_SQL The RPG code for the DATE_SQL service program, which contains the functions. It is free format but the D-Specs are still fixed, and it can be edited in SEU. (When I originally wrote it, it was in fixed form RPGIV.) ## DATE_SQLFR This is DATE_SQL but converted to totally free form. I converted it using [RpgFreeWeb](https://github.com/worksofbarry/rpgfreeweb), which does a nice job. ## DATECRTFN This is SQL "Create Function" code that tells SQL where the functions are. ## TEST_CYMD/TEST_MDY/TEST_YMD There are example SQL statements that can be used to test the three functions.