The functions discussed in this article won’t save time in the literal sense; mankind has yet to invent a time machine. However, these functions will surely cut down on the time it takes an RPG programmer to perform complicated “date math.”
As I mentioned in the previous article, there’s no BIF to return the day of the week, for instance. SQL provides several simple-to-use scalar functions that do that and more, as you’ll see later in this article.
Before getting to that, let me take a moment to address some readers’ remarks regarding the functions I presented in the previous article; there’s a common attribute to these three functions that some RPG programmers find strange: Unlike their RPG BIF counterparts, it’s not possible to use them without parameters. While in RPG you can assign the value of %DATE() to a variable and get the current date, DATE() won’t work in SQL. There’s another function for that: CURDATE. This function returns the current system date. It’s very simple to use:
As you might have guessed, there’s also a function for the current system time: CURTIME. And yet another that returns the system time in a timestamp data type: NOW. Let’s see an example of these two functions:
It’s important to mention that whenever a statement has more than one of the CURDATE, CURTIME, or NOW functions, the value returned by the system is based on the same clock reading. In other words, even if the statement takes more than a second to execute, the values returned for the aforementioned functions will be similar, just presented with different precision.
SQL might be considered a bit quirky in this current date/time issue for an RPG programmer, but there are other date-related functions that every programmer will find most useful. For instance, RPG doesn’t provide a BIF to determine the day of the week. Let’s explore the alternatives SQL provides, starting with the DAYNAME function. This function takes a valid date representation, either in a date, timestamp, or string data type and returns the day of the week in the system’s national language. For instance, the code below returns ‘Wednesday’, assuming the system-configured language is English.
Yes, it’s really that simple. Equally simple is the function that returns the name of the month: MONTHNAME. This is also a quick win; you supply a valid date, just like you’d do in the DAYNAME function, and the MONTHNAME function returns the name of the month. Let’s see an example:
This will return ‘March’, assuming that your system’s language is English. It’s really very simple and straightforward, right?
It’s also simple to extract parts of a date; in fixed-format RPG, there’s an operation code for that: EXTRCT. This evolved to the %SUBDT BIF, which is especially useful because EXTRCT didn’t make it to free-format RPG. Anyway, SQL has its own version of this operation code: the EXTRACT function. It works like its RPG counterpart but with increased readability. You basically “tell” the system to EXTRACT the YEAR, MONTH, DAY, HOUR, MINUTE, or SECOND FROM a valid date, time, or timestamp representation, just like the previous functions. Noticed the weird capitalization? There’s a reason for that; just look at the example and you’ll figure it out:
SELECT EXTRACT(DAY FROM ‘2015-03-04’)
See what I mean? This returns 4 in integer format. Let’s see a time example next:
SELECT EXTRACT(MINUTE FROM ’14.28.45’)
This returns 28 in integer format.
Of course, there are also individual functions to extract each of the parts of a date, time, or timestamp; they have the same names as their RPG BIF counterparts. The YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, and MICROSECOND SQL functions receive (you guessed it) a valid date representation and return the namesake portion of the date/time/timestamp in integer format. Here’s an SQL statement that produces a nicely formatted date:
|| ', '
|| ' '
|| ', '
Depending on the date you’re reading this, the results will obviously vary. Assume that today is ‘2015-03-04’; the statement returns the following string: ‘Wednesday, March 4, 2015’. Notice that the MONTHNAME, DAY, and YEAR functions are enclosed within a CHAR function; this is necessary because these functions return an integer. I need to convert these functions’ output to a string in order to stitch them to form the output string. However, that output will contain a lot of blank spaces; the easiest way to remove them is by enclosing the CHAR functions in TRIM functions.
Just a side note: There’s also a DAYOFMONTH function that behaves exactly like the DAY function, accepting the same input and producing the same output. It would take a considerably longer piece of RPG code to produce this output, even with the help of ILE and BIFs.
The next article will continue to explore SQL’s “date math” functions, with a couple of them that can be particular useful in reports: WEEK, which returns the number of the week of the year for a given date, and QUARTER, which returns the quarter (1st, 2nd, 3rd or 4th) of a date specified by the user. Until then, I’m looking forward to your suggestions, comments, and questions! Use the comments section below to speak your mind.