in empire-db/src/main/java/org/apache/empire/db/DBSQLBuilder.java [356:411]
protected String getDateTimeString(Object value, DBSqlPhrase sqlTemplate, DBSqlPhrase sqlPattern, DBSqlPhrase sqlCurrentDate)
{
// is it a sysdate expression
if (DBDatabase.SYSDATE.equals(value))
return dbms.getSQLPhrase(sqlCurrentDate);
// Format the date (ymd)
Timestamp ts;
if ((value instanceof Timestamp))
{ // We have a timestamp
ts = (Timestamp)value;
}
else if ((value instanceof Date))
{ // Convert Date to Timestamp
ts = new Timestamp(((Date)value).getTime());
}
else if ((value instanceof LocalDate))
{ // Convert LocalDate to Timestamp
ts = java.sql.Timestamp.valueOf(((LocalDate)value).atStartOfDay());
}
else if ((value instanceof LocalDateTime))
{ // Convert LocalDateTime to Timestamp
ts = java.sql.Timestamp.valueOf((LocalDateTime)value);
}
else if ((value instanceof LocalTime))
{ // Convert LocalTime to Timestamp with current date
ts = java.sql.Timestamp.valueOf(((LocalTime)value).atDate(LocalDate.now()));
}
else
{ // "Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]"
String dtValue = value.toString().trim();
try
{ // parse timestamp
ts = Timestamp.valueOf(dtValue);
} catch (Throwable e) {
// Invalid date
log.error("Unable to parse date value "+dtValue, e);
throw new InvalidArgumentException("value", value);
}
}
// Convert to String
String pattern = dbms.getSQLPhrase(sqlPattern);
SimpleDateFormat sqlFormat = new SimpleDateFormat(dbms.getSQLPhrase(sqlPattern));
String datetime = sqlFormat.format(ts);
// Add micro / nanoseconds
int nanos = (ts.getNanos() % 1000000);
if (pattern.endsWith(".SSS") && nanos>0)
{ // Add nanoseconds
if (((nanos) % 100)>0)
datetime += String.format("%06d", nanos);
else
datetime += String.format("%04d",(nanos/100));
}
// Now Build String
String template = dbms.getSQLPhrase(sqlTemplate);
return StringUtils.replace(template, "{0}", datetime);
}