DATE and DATETIME data types

Informix®

Informix provides two data types to store date and time information:

  • DATE = for year, month and day storage.
  • DATETIME = for year to fraction (1-5) storage.

The DATE type is stored as an INTEGER with the number of days since 1899/12/31.

The DATETIME type can be defined with various time units, by specifying a start and end qualifier. For example, you can define a datetime to store an hour-to-second time value with DATETIME HOUR TO SECOND.

The values of Informix DATETIME can be represented with a character string literal, or as DATETIME() literals:
'2017-12-24 15:45:12.345'  -- a DATETIME YEAR TO FRACTION(3)
'15:45'   -- a DATETIME HOUR TO MINUTE
DATETIME(2017-12-24 12:45) YEAR TO MINUTE
DATETIME(12:45:56.333) HOUR TO FRACTION(3)
Informix is able to convert quoted strings to DATE / DATETIME data, if the string contains matching environment parameters. The string to date conversion rules for DATE is defined by the DBDATE environment variable. The string to datetime format for DATETIME is defined by the GL_DATETIME environment variable.
Note: Within Genero programs, the string representation for DATETIME values is always ISO (YYYY-MM-DD hh:mm:ss.fffff)

Informix supports date arithmetic on DATE and DATETIME values. The result of an arithmetic expression involving dates/times is an INTEGER number of days when only DATE values are used, and an INTERVAL value if a DATETIME is used in the expression.

Informix automatically converts an INTEGER to a DATE when the integer is used to set a value of a date column.

IBM® DB2®

IBM DB2 provides the following data type to store date and time data:

Table 1. IBM DB2 date/time data types
IBM DB2 data type Description
DATE for year, month, day storage
TIME for hour, minutes, seconds storage
TIMESTAMP for year, month, day, hour, minutes, seconds, fraction(12) storage

Like Informix, IBM DB2 can convert quoted strings to dates, times or timestamps. Only one format is possible: 'yyyy-mm-dd' for dates, 'hh:mm:ss' for times and 'yyyy-mm-dd hh:mm:ss:f' for timestamps.

In IBM DB2, the result of a date/time arithmetic expression involving DATE values is a number of days with a decimal part representing the fraction of the day ( 0.5 = 12H00, 2.00694444 = (2 + (10/1440)) = 2 days and 10 minutes ) ). The result of a date/time arithmetic expression involving TIME or TIMESTAMP values is a number of seconds with a decimal part representing the fraction of seconds.

Solution

Use the following conversion rules to map Informix date/time types to IBM DB2 date/time types:

Table 2. Informix data types and IBM DB2 equivalents
Informix data type IBM DB2 data type
DATE DATE
DATETIME HOUR TO SECOND TIME
DATETIME q1 TO q2 (different from above) TIMESTAMP
The DATE and DATETIME types translation can be controlled with the following FGLPROFILE entries:
dbi.database.dsname.ifxemul.datatype.date = { true | false }
dbi.database.dsname.ifxemul.datatype.datetime = { true | false }
For more details see IBM Informix emulation parameters in FGLPROFILE.

DB2 has the same DATE data type as Informix DATE columns.

DB2 TIME data type can be used to store Informix DATETIME HOUR TO SECOND values. The database interface makes the conversion automatically.

Informix DATETIME values with any precision from YEAR to FRACTION(5) can be stored in DB2 TIMESTAMP columns. The database interface makes the conversion automatically. Missing date or time parts default to 1900-01-01 00:00:00.0. For example, when using a DATETIME HOUR TO MINUTE with the value of "11:45", the DB2 TIMESTAMP value will be "1900-01-01 11:45:00.0".

Important:
  • Using integers as a number of days in an expression with dates is not supported by IBM DB2. Check your code to detect where you are using integers with DATE columns.
  • Literal DATETIME and INTERVAL expressions (i.e. DATETIME (1999-10-12) YEAR TO DAY) are not converted.
  • It is strongly recommended that you use BDL variables in dynamic SQL statements instead of quoted strings representing DATE values. For example:
    LET stmt = "SELECT ... FROM customer WHERE creat_date >'", adate,"'"
    is not portable, use a question mark place holder instead and OPEN the cursor USING adate:
    LET stmt = "SELECT ... FROM customer WHERE creat_date > ?"
  • DATE arithmetic expressions using SQL parameters (USING variables) are not fully supported. The next example generates an error at PREPARE time:
    SELECT ... WHERE datecol < ? +1
  • SQL Statements using expressions with TODAY / CURRENT / EXTEND must be reviewed and adapted to the native syntax.

Date/time SQL functions

Table 3. Informix and IBM DB2 date/time SQL functions
Informix IBM DB2
today current date
current hour to second current time
current year to fraction(5) current timestamp