sql - 在 Informix 中将 DATETIME 转换为 Unix 纪元

标签 sql informix datediff

我有一个 DATETIME 列:

从 mytable 中选择 mytime;

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

我想编写一条 SQL 语句,以 Unix 时间格式返回时间(自 Unix 纪元 - 01/01/1970 00:00:00 以来的秒数)作为 INTEGER。我尝试使用 DATEDIFFCAST 但没有运气。这是 Informix 数据库。

最佳答案

假设 mytime 列是 DATETIME YEAR TO SECOND 列(尽管问题中显示了格式),则以下存储过程可以完成这项工作。它的注释比过程多,但注释解释了它在做什么。

{
#   "@(#)$Id: tounixtime.spl,v 1.6 2002/09/25 18:10:48 jleffler Exp $"
#
# Stored procedure TO_UNIX_TIME written by Jonathan Leffler (previously
# <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="94fef8f1f2f2f8f1e6d4fdfaf2fbe6f9fdecbaf7fbf9" rel="noreferrer noopener nofollow">[email protected]</a> and now <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7f15131a1919131a0d3f0a0c51161d12511c1012" rel="noreferrer noopener nofollow">[email protected]</a>).  Includes fix for
# bug reported by Tsutomu Ogiwara <<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="60341315140f0d154e2f070917011201200314034d074e030f4e0a10" rel="noreferrer noopener nofollow">[email protected]</a>> 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;

关于sql - 在 Informix 中将 DATETIME 转换为 Unix 纪元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14187569/

相关文章:

python sqlite3 行没有正确评估

sql - Postgresql IN 语句

jdbc - Informix JDBC 时间戳字符串格式

php - 快照启动后 : Informix Client -23101/Oracle instant client -28759

mysql - 仅对一列和特定状态的子集使用 datediff

sql - 有没有办法强制 Oracle 在加入访问后评估过滤器?

sql - 创建一个字段来计算日期范围内一个月内的天数?

delphi - Delphi XE2 Professional 的 Informix native 驱动程序?

php - 使用 MySQL 和 PHP 计算某个日期期间的占用天数

java - 如何找到存储在同一行mysql的2列中的日期差异