You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@empire-db.apache.org by do...@apache.org on 2022/03/04 23:52:04 UTC

[empire-db] branch master updated: EMPIREDB-362 Added DataType for TIME

This is an automated email from the ASF dual-hosted git repository.

doebele pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/empire-db.git


The following commit(s) were added to refs/heads/master by this push:
     new bc936af  EMPIREDB-362 Added DataType for TIME
bc936af is described below

commit bc936af7ef3b7cb6e5da6e46715727e865364945
Author: Rainer Döbele <do...@apache.org>
AuthorDate: Sat Mar 5 00:52:01 2022 +0100

    EMPIREDB-362 Added DataType for TIME
---
 .../java/org/apache/empire/commons/DateUtils.java  |  5 +++++
 .../main/java/org/apache/empire/data/DataType.java | 25 +++++++++++++---------
 .../java/org/apache/empire/db/DBDDLGenerator.java  |  4 ++++
 .../main/java/org/apache/empire/db/DBDatabase.java | 20 +++++++++++++++--
 .../empire/db/validation/DBModelChecker.java       |  1 +
 .../apache/empire/db/validation/DBModelParser.java |  4 +++-
 .../org/apache/empire/dbms/DBMSHandlerBase.java    | 10 +++++++--
 .../java/org/apache/empire/dbms/DBSqlPhrase.java   | 11 ++++++----
 .../apache/empire/dbms/derby/DBMSHandlerDerby.java |  6 +++++-
 .../org/apache/empire/dbms/h2/DBMSHandlerH2.java   |  6 +++++-
 .../apache/empire/dbms/hsql/DBMSHandlerHSql.java   |  9 +++++---
 .../apache/empire/dbms/mysql/DBMSHandlerMySQL.java | 14 +++++++-----
 .../empire/dbms/oracle/DBMSHandlerOracle.java      |  5 +++++
 .../dbms/postgresql/DBMSHandlerPostgreSQL.java     |  4 ++++
 .../empire/dbms/sqlite/DBMSHandlerSQLite.java      |  6 ++++--
 .../empire/dbms/sqlserver/DBMSHandlerMSSQL.java    |  4 ++++
 16 files changed, 103 insertions(+), 31 deletions(-)

diff --git a/empire-db/src/main/java/org/apache/empire/commons/DateUtils.java b/empire-db/src/main/java/org/apache/empire/commons/DateUtils.java
index 7ae31ef..2b29857 100644
--- a/empire-db/src/main/java/org/apache/empire/commons/DateUtils.java
+++ b/empire-db/src/main/java/org/apache/empire/commons/DateUtils.java
@@ -164,6 +164,11 @@ public class DateUtils
         return setTime(date, 0, 0, 0, 0);
     }
 
+    public static Date getTimeOnly(Date date)
+    {
+        return setDate(date, 0, 0, 0);
+    }
+
     public static long compareDates(Date date1, Date date2)
     {
         long time1 = setTime(date1, 0, 0, 0, 0).getTime();
diff --git a/empire-db/src/main/java/org/apache/empire/data/DataType.java b/empire-db/src/main/java/org/apache/empire/data/DataType.java
index fcf198c..f090737 100644
--- a/empire-db/src/main/java/org/apache/empire/data/DataType.java
+++ b/empire-db/src/main/java/org/apache/empire/data/DataType.java
@@ -60,47 +60,52 @@ public enum DataType
     /**
      * Date value including time. Also knows a timestamp
      */
-    DATETIME, //     = 5;
+    TIME, //         = 5;
+    
+    /**
+     * Date value including time. Also knows a timestamp
+     */
+    DATETIME, //     = 6;
     
     /**
      * Automatic Record timestamp (only one per table allowed)  
      */
-    TIMESTAMP, //    = 6;
+    TIMESTAMP, //    = 7;
     
     /**
      * Fixed length character value.
      */
-    CHAR, //         = 7;
+    CHAR, //         = 8;
     
     /**
      * floating point value
      */
-    FLOAT, //        = 8;
+    FLOAT, //        = 9;
     
     /**
      * Decimal numeric value (size indicates scale and precision)
      */
-    DECIMAL, //      = 9;
+    DECIMAL, //      = 10;
     
     /**
      * Boolean field (emulated if not supported by DBMS as number or char)
      */
-    BOOL, //         = 10;
+    BOOL, //         = 11;
     
     /**
      * Long text &gt; 2K
      */
-    CLOB, //         = 11;
+    CLOB, //         = 12;
     
     /**
      * Binary data
      */
-    BLOB, //         = 12;
+    BLOB, //         = 13;
     
     /**
      * Unique Identifier (non-numeric, treated like text) 
      */
-    UNIQUEID; //     = 13;
+    UNIQUEID; //     = 14;
     
     /**
      * Returns true if the data type is a text based data type (char, text or clob)
@@ -126,7 +131,7 @@ public enum DataType
      */
     public boolean isDate()
     {
-        return (this==DataType.DATE || this==DataType.DATETIME || this==DataType.TIMESTAMP);
+        return (this==DataType.DATE || this==DataType.DATETIME || this==DataType.TIMESTAMP || this==DataType.TIME);
     }
 
     /**
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBDDLGenerator.java b/empire-db/src/main/java/org/apache/empire/db/DBDDLGenerator.java
index c1347a9..bbd0c4b 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBDDLGenerator.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBDDLGenerator.java
@@ -52,6 +52,7 @@ public abstract class DBDDLGenerator<T extends DBMSHandler>
     protected String DATATYPE_CHAR       = "CHAR";      // Fixed length characters (unicode)
     protected String DATATYPE_VARCHAR    = "VARCHAR";   // variable length characters (unicode)      
     protected String DATATYPE_DATE       = "DATE";
+    protected String DATATYPE_TIME       = "TIME";    
     protected String DATATYPE_TIMESTAMP  = "TIMESTAMP";
     protected String DATATYPE_BOOLEAN    = "BIT";
     protected String DATATYPE_DECIMAL    = "DECIMAL";
@@ -158,6 +159,9 @@ public abstract class DBDDLGenerator<T extends DBMSHandler>
             case DATE:
                 sql.append(DATATYPE_DATE);
                 break;
+            case TIME:
+                sql.append(DATATYPE_TIME);
+                break;
             case DATETIME:
             case TIMESTAMP:
                 sql.append(DATATYPE_TIMESTAMP);
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java b/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java
index bf1c688..4daacaf 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java
@@ -25,6 +25,7 @@ import java.sql.Timestamp;
 import java.text.ParseException;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
@@ -149,6 +150,8 @@ public abstract class DBDatabase extends DBObject
     
     protected DBMSHandler dbms    = null;
     
+    protected boolean legacyDate  = true; // When true not using Java8 Local???? Types
+    
     /**   
      * Property that indicates whether to always use usePreparedStatements (Default is false!)
      * Note: This will only apply for update and insert commands as well as for read operations on a DBRecord.
@@ -525,7 +528,7 @@ public abstract class DBDatabase extends DBObject
             buf.append(linkName);
         }
     }
-   
+    
     /**
      * Returns the java class type for a given dataType
      * @param type the data type
@@ -536,15 +539,28 @@ public abstract class DBDatabase extends DBObject
         switch(expr.getDataType())
         {
             case AUTOINC:
+                return Long.class;
             case INTEGER:
+            {   // Check Integer size
+                DBColumn source = expr.getSourceColumn();
+                int size = (source!=null ? (int)source.getSize() : DBTable.INT_SIZE_BIG);
+                if (size<=DBTable.INT_SIZE_SMALL)
+                    return Short.class;
+                if (size<=DBTable.INT_SIZE_MEDIUM)
+                    return Integer.class;
+                // Default to Long
                 return Long.class;
+            }
             case VARCHAR:
             case CLOB:
             case CHAR:
                 return String.class;
             case DATE:
+                return (legacyDate ? Date.class : LocalDate.class);
+            case TIME:
+                return (legacyDate ? Date.class : LocalTime.class);
             case DATETIME:
-                return Date.class;
+                return (legacyDate ? Date.class : LocalDateTime.class);
             case TIMESTAMP:
                 return Timestamp.class;
             case FLOAT:
diff --git a/empire-db/src/main/java/org/apache/empire/db/validation/DBModelChecker.java b/empire-db/src/main/java/org/apache/empire/db/validation/DBModelChecker.java
index 817c8bd..b46ea2d 100644
--- a/empire-db/src/main/java/org/apache/empire/db/validation/DBModelChecker.java
+++ b/empire-db/src/main/java/org/apache/empire/db/validation/DBModelChecker.java
@@ -254,6 +254,7 @@ public class DBModelChecker
                 checkTextColumn(column, remoteColumn, handler);
                 break;
             case DATE:
+            case TIME:
             case DATETIME:
             case TIMESTAMP:
                 checkDateColumn(column, remoteColumn, handler);
diff --git a/empire-db/src/main/java/org/apache/empire/db/validation/DBModelParser.java b/empire-db/src/main/java/org/apache/empire/db/validation/DBModelParser.java
index 0c49e26..a3232d1 100644
--- a/empire-db/src/main/java/org/apache/empire/db/validation/DBModelParser.java
+++ b/empire-db/src/main/java/org/apache/empire/db/validation/DBModelParser.java
@@ -552,8 +552,10 @@ public class DBModelParser
             case Types.DATE:
                 empireType = DataType.DATE;
                 break;
-            case Types.TIMESTAMP:
             case Types.TIME:
+                empireType = DataType.TIME;
+                break;
+            case Types.TIMESTAMP:
                 empireType = DataType.DATETIME;
                 break;
             case Types.CHAR:
diff --git a/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandlerBase.java b/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandlerBase.java
index 6f7d485..b98c3b6 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandlerBase.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandlerBase.java
@@ -447,12 +447,16 @@ public abstract class DBMSHandlerBase implements DBMSHandler
         {   // emulate using java.util.UUID
             return UUID.randomUUID();
         }
-        else if (type==DataType.DATE || type==DataType.DATETIME || type==DataType.TIMESTAMP)
+        else if (type==DataType.DATE || type==DataType.TIME || type==DataType.DATETIME || type==DataType.TIMESTAMP)
         {   if (conn==null)
                 return null; // No connection
             // Get database system's date and time
             Date ts = getUpdateTimestamp(conn);
-            return (type==DataType.DATE ? DateUtils.getDateOnly(ts) : ts);
+            if (type==DataType.DATE)
+                return DateUtils.getDateOnly(ts);
+            if (type==DataType.TIME)
+                return DateUtils.getTimeOnly(ts);
+            return ts;
         }
         // Other types
         throw new NotSupportedException(this, "getColumnAutoValue() for "+type);
@@ -525,6 +529,8 @@ public abstract class DBMSHandlerBase implements DBMSHandler
         {
             case DATE:
                 return getSQLDateTimeString(value, DBSqlPhrase.SQL_DATE_TEMPLATE, DBSqlPhrase.SQL_DATE_PATTERN, DBSqlPhrase.SQL_CURRENT_DATE);
+            case TIME:
+                return getSQLDateTimeString(value, DBSqlPhrase.SQL_TIME_TEMPLATE, DBSqlPhrase.SQL_TIME_PATTERN, DBSqlPhrase.SQL_CURRENT_TIME);
             case DATETIME:
                 // Only date (without time) provided?
                 if (!DBDatabase.SYSDATE.equals(value) && !(value instanceof Date) && ObjectUtils.lengthOf(value)<=10)
diff --git a/empire-db/src/main/java/org/apache/empire/dbms/DBSqlPhrase.java b/empire-db/src/main/java/org/apache/empire/dbms/DBSqlPhrase.java
index a13e64c..b2d2c21 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/DBSqlPhrase.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/DBSqlPhrase.java
@@ -20,10 +20,13 @@ public enum DBSqlPhrase
     // data types
     SQL_BOOLEAN_TRUE        ("1"),          // Oracle Y
     SQL_BOOLEAN_FALSE       ("0"),          // Oracle N
-    SQL_CURRENT_DATE        ("sysdate"),    // Oracle
-    SQL_DATE_PATTERN        ("yyyy-MM-dd"), // SimpleDateFormat
-    SQL_DATE_TEMPLATE       ("TO_DATE('{0}', 'YYYY-MM-DD')"),   // MSSql: convert(date, '{0}', 111)
-    SQL_DATETIME_PATTERN    ("yyyy-MM-dd HH:mm:ss.SSS"),        // SimpleDateFormat
+    SQL_CURRENT_DATE        ("CURRENT_DATE"), 
+    SQL_DATE_PATTERN        ("yyyy-MM-dd"),   // SimpleDateFormat
+    SQL_DATE_TEMPLATE       ("TO_DATE('{0}', 'YYYY-MM-DD')"),  // MSSql: convert(date, '{0}', 111)
+    SQL_CURRENT_TIME        ("CURRENT_TIME"), // MSSql: CONVERT(time, getdate());
+    SQL_TIME_PATTERN        ("HH:mm:ss"),     // SimpleDateFormat
+    SQL_TIME_TEMPLATE       ("'{0}'"),        // MSSql: convert(time, '{0}')
+    SQL_DATETIME_PATTERN    ("yyyy-MM-dd HH:mm:ss.SSS"), // SimpleDateFormat        
     SQL_DATETIME_TEMPLATE   ("TO_DATE('{0}', 'YYYY-MM-DD HH24:MI:SS')"), // Oracle
     SQL_CURRENT_TIMESTAMP   ("systimestamp"),                   // Oracle
     SQL_TIMESTAMP_PATTERN   ("yyyy-MM-dd HH:mm:ss.SSS"),        // SimpleDateFormat
diff --git a/empire-db/src/main/java/org/apache/empire/dbms/derby/DBMSHandlerDerby.java b/empire-db/src/main/java/org/apache/empire/dbms/derby/DBMSHandlerDerby.java
index 2e1f9c7..ad099f7 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/derby/DBMSHandlerDerby.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/derby/DBMSHandlerDerby.java
@@ -165,9 +165,12 @@ public class DBMSHandlerDerby extends DBMSHandlerBase
             // data types
             case SQL_BOOLEAN_TRUE:            return "1";
             case SQL_BOOLEAN_FALSE:           return "0";
-            case SQL_CURRENT_DATE:            return "CURRENT_DATE()";
+            case SQL_CURRENT_DATE:            return "CURRENT_DATE";
             case SQL_DATE_PATTERN:            return "yyyy-MM-dd";
             case SQL_DATE_TEMPLATE:           return "'{0}'";
+            case SQL_CURRENT_TIME:            return "CURRENT_TIME";
+            case SQL_TIME_PATTERN:            return "HH:mm:ss";
+            case SQL_TIME_TEMPLATE:           return "'{0}'";            
             case SQL_DATETIME_PATTERN:        return "yyyy-MM-dd HH:mm:ss";
             case SQL_DATETIME_TEMPLATE:       return "'{0}'";
             case SQL_CURRENT_TIMESTAMP:       return "CURRENT_TIMESTAMP";
@@ -230,6 +233,7 @@ public class DBMSHandlerDerby extends DBMSHandlerBase
            case DECIMAL:   return "CAST(? AS DECIMAL)";
            case FLOAT:     return "CAST(? AS DECIMAL)";
            case DATE:      return "CAST(? AS DATE)";
+           case TIME:      return "CAST(? AS TIME)";
            case DATETIME:
            case TIMESTAMP: return "CAST(? AS TIMESTAMP)";
            // Convert to text
diff --git a/empire-db/src/main/java/org/apache/empire/dbms/h2/DBMSHandlerH2.java b/empire-db/src/main/java/org/apache/empire/dbms/h2/DBMSHandlerH2.java
index 3f4eafd..f09a6f3 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/h2/DBMSHandlerH2.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/h2/DBMSHandlerH2.java
@@ -240,9 +240,12 @@ public class DBMSHandlerH2 extends DBMSHandlerBase
             // data types
             case SQL_BOOLEAN_TRUE:            return "1";
             case SQL_BOOLEAN_FALSE:           return "0";
-            case SQL_CURRENT_DATE:            return "CURRENT_DATE()";
+            case SQL_CURRENT_DATE:            return "CURRENT_DATE";
             case SQL_DATE_PATTERN:            return "yyyy-MM-dd";
             case SQL_DATE_TEMPLATE:           return "'{0}'";
+            case SQL_CURRENT_TIME:            return "CURRENT_TIME";
+            case SQL_TIME_PATTERN:            return "HH:mm:ss";
+            case SQL_TIME_TEMPLATE:           return "'{0}'";
             case SQL_DATETIME_PATTERN:        return "yyyy-MM-dd HH:mm:ss";
             case SQL_DATETIME_TEMPLATE:       return "'{0}'";
             case SQL_CURRENT_TIMESTAMP:       return "NOW()";
@@ -305,6 +308,7 @@ public class DBMSHandlerH2 extends DBMSHandlerBase
            case DECIMAL:   return "CAST(? AS DECIMAL)";
            case FLOAT:     return "CAST(? AS DECIMAL)";
            case DATE:      return "CAST(? AS DATE)";
+           case TIME:      return "CAST(? AS TIME)";
            case DATETIME:
            case TIMESTAMP: return "CAST(? AS DATETIME)";
            // Convert to text
diff --git a/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBMSHandlerHSql.java b/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBMSHandlerHSql.java
index 494e3ed..aafefc9 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBMSHandlerHSql.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBMSHandlerHSql.java
@@ -117,12 +117,15 @@ public class DBMSHandlerHSql extends DBMSHandlerBase
             case SQL_BOOLEAN_FALSE:     return String.valueOf(Boolean.FALSE);
             case SQL_CURRENT_DATE:      return "CURRENT_DATE";
             case SQL_DATE_PATTERN:      return "yyyy-MM-dd";
-            case SQL_DATE_TEMPLATE:     return "'{0}'";
+            case SQL_DATE_TEMPLATE:     return "TO_DATE('{0}', 'YYYY-MM-DD')";
+            case SQL_CURRENT_TIME:      return "CURRENT_TIME";
+            case SQL_TIME_PATTERN:      return "HH:mm:ss";
+            case SQL_TIME_TEMPLATE:     return "'{0}'";
             case SQL_DATETIME_PATTERN:  return "yyyy-MM-dd HH:mm:ss.S";
-            case SQL_DATETIME_TEMPLATE: return "'{0}'";
+            case SQL_DATETIME_TEMPLATE: return "TO_DATE('{0}', 'YYYY-MM-DD HH24:MI:SS')";
             case SQL_CURRENT_TIMESTAMP: return "CURRENT_TIMESTAMP";
             case SQL_TIMESTAMP_PATTERN: return "yyyy-MM-dd HH:mm:ss.S";
-            case SQL_TIMESTAMP_TEMPLATE:return "'{0}'";
+            case SQL_TIMESTAMP_TEMPLATE:return "TO_TIMESTAMP('{0}', 'YYYY-MM-DD HH24:MI:SS.FF')";
             // functions
             case SQL_FUNC_COALESCE:     return "coalesce(?, {0})";
             case SQL_FUNC_SUBSTRING:    return "substr(?, {0})";
diff --git a/empire-db/src/main/java/org/apache/empire/dbms/mysql/DBMSHandlerMySQL.java b/empire-db/src/main/java/org/apache/empire/dbms/mysql/DBMSHandlerMySQL.java
index 81bedd6..6dde1af 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/mysql/DBMSHandlerMySQL.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/mysql/DBMSHandlerMySQL.java
@@ -998,12 +998,15 @@ public class DBMSHandlerMySQL extends DBMSHandlerBase
             case SQL_BOOLEAN_FALSE:           return "0";
             case SQL_CURRENT_DATE:            return "CURRENT_DATE()";
             case SQL_DATE_PATTERN:            return "yyyy-MM-dd";
-            case SQL_DATE_TEMPLATE:           return "'{0}'";
+            case SQL_DATE_TEMPLATE:           return "STR_TO_DATE('{0}','%Y-%m-%d')";
+            case SQL_CURRENT_TIME:            return "CURRENT_TIME()";
+            case SQL_TIME_PATTERN:            return "HH:mm:ss";
+            case SQL_TIME_TEMPLATE:           return "STR_TO_DATE('{0}','%H:%i:%s')";
             case SQL_DATETIME_PATTERN:        return "yyyy-MM-dd HH:mm:ss";
-            case SQL_DATETIME_TEMPLATE:       return "'{0}'";
-            case SQL_CURRENT_TIMESTAMP:       return "NOW()";
-            case SQL_TIMESTAMP_PATTERN:       return "yyyy-MM-dd HH:mm:ss";
-            case SQL_TIMESTAMP_TEMPLATE:      return "'{0}'";
+            case SQL_DATETIME_TEMPLATE:       return "STR_TO_DATE('{0}','%Y-%m-%d %H:%i:%s')";
+            case SQL_CURRENT_TIMESTAMP:       return "CURRENT_TIMESTAMP()";
+            case SQL_TIMESTAMP_PATTERN:       return "yyyy-MM-dd HH:mm:ss.SSS";
+            case SQL_TIMESTAMP_TEMPLATE:      return "STR_TO_DATE('{0}','%Y-%m-%d %H:%i:%s.%f')";
             // functions
             case SQL_FUNC_COALESCE:           return "coalesce(?, {0})";
             case SQL_FUNC_SUBSTRING:          return "substring(?, {0})";
@@ -1061,6 +1064,7 @@ public class DBMSHandlerMySQL extends DBMSHandlerBase
            case DECIMAL:   return "CAST(? AS DECIMAL)";
            case FLOAT:     return "CAST(? AS DECIMAL)";
            case DATE:      return "CAST(? AS DATE)";
+           case TIME:      return "CAST(? AS TIME)";
            case DATETIME:
            case TIMESTAMP: return "CAST(? AS DATETIME)";
            // Convert to text
diff --git a/empire-db/src/main/java/org/apache/empire/dbms/oracle/DBMSHandlerOracle.java b/empire-db/src/main/java/org/apache/empire/dbms/oracle/DBMSHandlerOracle.java
index 6495984..43f8ed8 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/oracle/DBMSHandlerOracle.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/oracle/DBMSHandlerOracle.java
@@ -183,6 +183,9 @@ public class DBMSHandlerOracle extends DBMSHandlerBase
             case SQL_CURRENT_DATE:              return "sysdate";
             case SQL_DATE_PATTERN:              return "yyyy-MM-dd";
             case SQL_DATE_TEMPLATE:             return "TO_DATE('{0}', 'YYYY-MM-DD')";
+            case SQL_CURRENT_TIME:              return "TO_DATE('2000-01-01'||TO_CHAR(sysdate, 'HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS')";
+            case SQL_TIME_PATTERN:              return "HH:mm:ss";
+            case SQL_TIME_TEMPLATE:             return "TO_DATE('2000-01-01 {0}'), 'YYYY-MM-DD HH24:MI:SS')";
             case SQL_CURRENT_TIMESTAMP:         return "systimestamp";
             case SQL_DATETIME_PATTERN:          
             case SQL_TIMESTAMP_PATTERN:         return "yyyy-MM-dd HH:mm:ss.SSS";
@@ -273,6 +276,8 @@ public class DBMSHandlerOracle extends DBMSHandlerBase
                     return "to_date(?, '"+format.toString()+"')";
                 }
                 return "to_date(?)";
+            case TIME:
+                return "to_date(?, 'HH24:mm:ss')";
             case TIMESTAMP:
                 if (format instanceof String)
                 { // Convert using a format string
diff --git a/empire-db/src/main/java/org/apache/empire/dbms/postgresql/DBMSHandlerPostgreSQL.java b/empire-db/src/main/java/org/apache/empire/dbms/postgresql/DBMSHandlerPostgreSQL.java
index ad010e3..d798160 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/postgresql/DBMSHandlerPostgreSQL.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/postgresql/DBMSHandlerPostgreSQL.java
@@ -383,6 +383,9 @@ public class DBMSHandlerPostgreSQL extends DBMSHandlerBase
             case SQL_CURRENT_DATE:            return "CURRENT_DATE";
             case SQL_DATE_PATTERN:            return "yyyy-MM-dd";
             case SQL_DATE_TEMPLATE:           return "'{0}'";
+            case SQL_CURRENT_TIME:            return "CURRENT_TIME";
+            case SQL_TIME_PATTERN:            return "HH:mm:ss";
+            case SQL_TIME_TEMPLATE:           return "'{0}'";
             case SQL_DATETIME_PATTERN:        return "yyyy-MM-dd HH:mm:ss.SSS";
             case SQL_DATETIME_TEMPLATE:       return "'{0}'";
             case SQL_CURRENT_TIMESTAMP:       return "NOW()";
@@ -445,6 +448,7 @@ public class DBMSHandlerPostgreSQL extends DBMSHandlerBase
             case DECIMAL:  return "CAST(? AS DECIMAL)";
             case FLOAT:    return "CAST(? AS DOUBLE PRECISION)";
             case DATE:     return "CAST(? AS DATE)";
+            case TIME:     return "CAST(? AS TIME)";
             case DATETIME:
             case TIMESTAMP:return "CAST(? AS TIMESTAMP)";
                 // Convert to text
diff --git a/empire-db/src/main/java/org/apache/empire/dbms/sqlite/DBMSHandlerSQLite.java b/empire-db/src/main/java/org/apache/empire/dbms/sqlite/DBMSHandlerSQLite.java
index 7a93b1d..964605d 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/sqlite/DBMSHandlerSQLite.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/sqlite/DBMSHandlerSQLite.java
@@ -319,9 +319,11 @@ public class DBMSHandlerSQLite extends DBMSHandlerBase
             // data types
             case SQL_BOOLEAN_TRUE:          return "1";
             case SQL_BOOLEAN_FALSE:         return "0";
-            case SQL_CURRENT_DATE:          return "SELECT date('now','localtime');";
+            case SQL_CURRENT_DATE:          return "date('now','localtime');";
             case SQL_DATE_PATTERN:          return "yyyy-MM-dd";
-            case SQL_DATE_TEMPLATE:         return "'{0}'";
+            case SQL_DATE_TEMPLATE:         return "date('{0}')";
+            case SQL_CURRENT_TIME:          return "time('now');";
+            case SQL_TIME_TEMPLATE:         return "time('{0}')";
             case SQL_DATETIME_PATTERN:      return "yyyy-MM-dd hh:mm:ss.sss";
             case SQL_DATETIME_TEMPLATE:     return "'{0}'";
             case SQL_CURRENT_TIMESTAMP:     return "NOW()";
diff --git a/empire-db/src/main/java/org/apache/empire/dbms/sqlserver/DBMSHandlerMSSQL.java b/empire-db/src/main/java/org/apache/empire/dbms/sqlserver/DBMSHandlerMSSQL.java
index 6faf707..4e08b35 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/sqlserver/DBMSHandlerMSSQL.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/sqlserver/DBMSHandlerMSSQL.java
@@ -330,6 +330,9 @@ public class DBMSHandlerMSSQL extends DBMSHandlerBase
             case SQL_CURRENT_DATE:            return "convert(char, getdate(), 111)";
             case SQL_DATE_PATTERN:            return "yyyy-MM-dd";
             case SQL_DATE_TEMPLATE:           return "convert(date, '{0}', 111)";
+            case SQL_CURRENT_TIME:            return "convert(time, getdate())";
+            case SQL_TIME_PATTERN:            return "HH:mm:ss";
+            case SQL_TIME_TEMPLATE:           return "convert(time, '{0}')";
             case SQL_DATETIME_PATTERN:        return "yyyy-MM-dd HH:mm:ss.SSS";
             case SQL_DATETIME_TEMPLATE:       return isUseDateTime2() ? "convert(datetime2, '{0}', 121)"
                                                                       : "convert(datetime,  '{0}', 121)";
@@ -394,6 +397,7 @@ public class DBMSHandlerMSSQL extends DBMSHandlerBase
            case DECIMAL:   return "convert(decimal, ?)";
            case FLOAT:     return "convert(float, ?)";
            case DATE:      return "convert(date, ?, 111)";
+           case TIME:      return "convert(time, ?)";
            case DATETIME:
            case TIMESTAMP: return isUseDateTime2() ? "convert(datetime2, ?, 121)"
                                                    : "convert(datetime,  ?, 121)";