将DATETIME转换为Informix中的Unix时代

问题描述 投票:2回答:2

我有一个DATETIME列:

SELECT mytime FROM mytable;

mytime
--------------------
1/6/2013 10:41:41 PM

我想编写一条SQL语句,以INTEGER的形式返回Unix时间格式的时间(自Unix Epoch-1970年1月1日00:00:00以来的秒数)。我尝试使用DATEDIFFCAST,但没有运气。这是Informix数据库。

sql informix datediff
2个回答
3
投票
{ # "@(#)$Id: tounixtime.spl,v 1.6 2002/09/25 18:10:48 jleffler Exp $" # # Stored procedure TO_UNIX_TIME written by Jonathan Leffler (previously # [email protected] and now [email protected]). Includes fix for # bug reported by Tsutomu Ogiwara <[email protected]> on # 2001-07-13. Previous version used DATETIME(0) SECOND TO SECOND # instead of DATETIME(0:0:0) HOUR TO SECOND, and when the calculation # extended the shorter constant to DATETIME HOUR TO SECOND, it added the # current hour and minute fields, as documented in the Informix Guide to # SQL: Syntax manual under EXTEND in the section on 'Expression'. # Amended 2002-08-23 to handle 'eternity' and annotated more thoroughly. # Amended 2002-09-25 to handle fractional seconds, as companion to the # new stored procedure FROM_UNIX_TIME(). # # If you run this procedure with no arguments (use the default), you # need to worry about the time zone the database server is using because # the value of CURRENT is determined by that, and you need to compensate # for it if you are using a different time zone. # # Note that this version works for dates after 2001-09-09 when the # interval between 1970-01-01 00:00:00+00:00 and current exceeds the # range of INTERVAL SECOND(9) TO SECOND. Returning DECIMAL(18,5) allows # it to work for all valid datetime values including fractional seconds. # In the UTC time zone, the 'Unix time' of 9999-12-31 23:59:59 is # 253402300799 (12 digits); the equivalent for 0001-01-01 00:00:00 is # -62135596800 (11 digits). Both these values are unrepresentable in # 32-bit integers, of course, so most Unix systems won't handle this # range, and the so-called 'Proleptic Gregorian Calendar' used to # calculate the dates ignores locale-dependent details such as the loss # of days that occurred during the switch between the Julian and # Gregorian calendar, but those are minutiae that most people can ignore # most of the time. } CREATE PROCEDURE to_unix_time(d DATETIME YEAR TO FRACTION(5) DEFAULT CURRENT YEAR TO FRACTION(5)) RETURNING DECIMAL(18,5); DEFINE n DECIMAL(18,5); DEFINE i1 INTERVAL DAY(9) TO DAY; DEFINE i2 INTERVAL SECOND(6) TO FRACTION(5); DEFINE s1 CHAR(15); DEFINE s2 CHAR(15); LET i1 = EXTEND(d, YEAR TO DAY) - DATETIME(1970-01-01) YEAR TO DAY; LET s1 = i1; LET i2 = EXTEND(d, HOUR TO FRACTION(5)) - DATETIME(00:00:00.00000) HOUR TO FRACTION(5); LET s2 = i2; LET n = s1 * (24 * 60 * 60) + s2; RETURN n; END PROCEDURE;

1
投票
© www.soinside.com 2019 - 2024. All rights reserved.