1
SELECT cast(current_date as timestamp(2));

SELECT ('1970-01-01 00:00:00' (timestamp(2)));

我需要获取 current_date ,1970-01-01 00:00:00 之间的秒数

用 SQL。

4

1 回答 1

4

这些是一些 SQL UDF,如果您不在 TD13.10 上,则可能只使用计算:

/**********
Converting Unix/POSIX time to a Timestamp 

Unix time: Number of seconds since 1970-01-01 00:00:00 UTC not counting leap seconds (currently 24 in 2011)

Also working for negative numbers.
The maximum range of Timestamps is based on the range of INTEGERs:
1901-12-13 20:45:52 (-2147483648) to 2038-01-19 03:14:07 (2147483647)

Can be changed to use BIGINT instead of INTEGER

20101211 initial version - Dieter Noeth
**********/

REPLACE FUNCTION UnixTime_to_TimeStamp (UnixTime INT)
RETURNS TIMESTAMP(0)
LANGUAGE SQL
CONTAINS SQL
DETERMINISTIC
SQL SECURITY DEFINER
COLLATION INVOKER
INLINE TYPE 1
RETURN 
CAST(DATE '1970-01-01' + (UnixTime / 86400) AS TIMESTAMP(0))
+ ((UnixTime MOD 86400) * INTERVAL '00:00:01' HOUR TO SECOND)
;

SELECT
   UnixTime_to_TimeStamp(-2147483648)
  ,UnixTime_to_TimeStamp(0)
  ,UnixTime_to_TimeStamp(2147483647)
;



/**********
Converting a Timestamp to Unix/POSIX time

Unix time: Number of seconds since 1970-01-01 00:00:00 UTC not counting leap seconds (currently 24 in 2011)

The maximum range of Timestamps is based on the range of INTEGERs:
1901-12-13 20:45:52 (-2147483648) to 2038-01-19 03:14:07 (2147483647)

Can be changed to use BIGINT instead of INTEGER

20101211 initial version - Dieter Noeth
**********/
REPLACE FUNCTION TimeStamp_to_UnixTime (ts TIMESTAMP(6))
RETURNS INTEGER
LANGUAGE SQL
CONTAINS SQL
DETERMINISTIC
SQL SECURITY DEFINER
COLLATION INVOKER
INLINE TYPE 1
RETURN 
(CAST(ts AS DATE) - DATE '1970-01-01') * 86400
+ (EXTRACT(HOUR FROM ts) * 3600)
+ (EXTRACT(MINUTE FROM ts) * 60)
+ (EXTRACT(SECOND FROM ts))
;

SELECT
   TimeStamp_to_UnixTime(TIMESTAMP '1901-12-13 20:45:52')
  ,TimeStamp_to_UnixTime(CURRENT_TIMESTAMP)
  ,TimeStamp_to_UnixTime(TIMESTAMP '2038-01-19 03:14:07')
;




/**********
Difference between two Timestamps in seconds

20101211 initial version - Dieter Noeth
**********/
REPLACE FUNCTION TimeStamp_Diff_Seconds
(
   ts1 TIMESTAMP(6)
  ,ts2 TIMESTAMP(6)
)
RETURNS DECIMAL(18,6)
LANGUAGE SQL
CONTAINS SQL
DETERMINISTIC
SQL SECURITY DEFINER
COLLATION INVOKER
INLINE TYPE 1
RETURN 
(CAST((CAST(ts2 AS DATE AT 0)- CAST(ts1 AS DATE AT 0)) AS DECIMAL(18,6)) * 86400)
      + ((EXTRACT(  HOUR FROM ts2) - EXTRACT(  HOUR FROM ts1)) * 3600)
      + ((EXTRACT(MINUTE FROM ts2) - EXTRACT(MINUTE FROM ts1)) * 60)
      +  (EXTRACT(SECOND FROM ts2) - EXTRACT(SECOND FROM ts1))
; 

SELECT
   TimeStamp_Diff_Seconds(TIMESTAMP '9999-12-31 23:59:59'
                         ,TIMESTAMP '0001-01-01 00:00:00')
  ,TimeStamp_Diff_Seconds(CURRENT_TIMESTAMP
                         ,TIMESTAMP '1970-01-01 00:00:00')
;
于 2013-07-18T16:34:58.363 回答