This will work in both Oracle and MySQL:
SELECT CURRENT_TIMESTAMP - INTERVAL '1' HOUR
FROM DUAL;
(Please note the difference between SYSTIMESTAMP
and CURRENT_TIMESTAMP
)
However, formatting it as a string requires TO_CHAR()
in Oracle:
SELECT TO_CHAR( CURRENT_TIMESTAMP - INTERVAL '1' HOUR, 'dd-mm-yy hh24:mi:ss' )
FROM DUAL;
and DATE_FORMAT()
in MySQL:
SELECT DATE_FORMAT( CURRENT_TIMESTAMP - INTERVAL '1' HOUR, '%d-%m-%y %H:%i:%s' )
FROM DUAL;
You can create a function in Oracle (or MySQL) that will convert one to the other:
CREATE FUNCTION DATE_FORMAT( value DATE, mask VARCHAR2 )
RETURN VARCHAR2 DETERMINISTIC
AS
p_mask VARCHAR2(4000) := mask;
BEGIN
p_mask := REPLACE( p_mask, '%Y', 'YYYY' );
p_mask := REPLACE( p_mask, '%y', 'YY' );
p_mask := REPLACE( p_mask, '%b', 'MON' );
p_mask := REPLACE( p_mask, '%M', 'MONTH' );
p_mask := REPLACE( p_mask, '%m', 'MM' );
p_mask := REPLACE( p_mask, '%a', 'DY' );
p_mask := REPLACE( p_mask, '%d', 'DD' );
p_mask := REPLACE( p_mask, '%H', 'HH24' );
p_mask := REPLACE( p_mask, '%h', 'HH12' );
p_mask := REPLACE( p_mask, '%i', 'MI' );
p_mask := REPLACE( p_mask, '%s', 'SS' );
RETURN TO_CHAR( value, p_mask );
END;
/
Then you can use the MySQL query in Oracle (or vice-versa, if you implement the inverse function).
If you really don't want to use a function to assist in conversion then this should work in both MySQL and Oracle:
SELECT CONCAT(
CASE WHEN MOD( EXTRACT( YEAR FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR ), 100 ) < 10
THEN CONCAT( '0', MOD( EXTRACT( YEAR FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR ), 100 ) )
ELSE CONCAT( '', MOD( EXTRACT( YEAR FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR ), 100 ) )
END,
'-',
CASE WHEN EXTRACT( MONTH FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR ) < 10
THEN CONCAT( '0', EXTRACT( MONTH FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR ) )
ELSE CONCAT( '', EXTRACT( MONTH FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR ) )
END,
'-',
CASE WHEN EXTRACT( DAY FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR ) < 10
THEN CONCAT( '0', EXTRACT( DAY FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR ) )
ELSE CONCAT( '', EXTRACT( DAY FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR ) )
END,
' ',
CASE WHEN EXTRACT( HOUR FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR ) < 10
THEN CONCAT( '0', EXTRACT( HOUR FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR ) )
ELSE CONCAT( '', EXTRACT( HOUR FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR ) )
END,
':',
CASE WHEN EXTRACT( MINUTE FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR ) < 10
THEN CONCAT( '0', EXTRACT( MINUTE FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR ) )
ELSE CONCAT( '', EXTRACT( MINUTE FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR ) )
END,
':',
CASE WHEN EXTRACT( SECOND FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR ) < 10
THEN CONCAT( '0', EXTRACT( SECOND FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR ) )
ELSE CONCAT( '', EXTRACT( SECOND FROM CURRENT_TIMESTAMP - INTERVAL '1' HOUR ) )
END
) AS formatted_date
FROM DUAL;