Informix - 需要为 Where 子句创建日期时间参数

Informix - Need to create date time parameters for Where clause

Informix 不是我的正常环境,它处理日期时间值的方式让我陷入困境。我无法想象这有多难,但对于我来说,我还无法弄清楚。

这是SQL:

SELECT  agentid, 
    extension As Ext,
    resourcefirstname As FirstNm, 
    resourcelastname As LastNm,
    Min(eventdatetime) As FirstIn 
   FROM agentstatedetail AS asdr Join
    resource As r On asdr.agentid = r.resourceid
   WHERE asdr.eventdatetime BETWEEN '2016-10-20 04:00:00' AND '2016-10-21 03:59:59'
AND eventtype = 3
AND assignedteamid = 14
Group By agentid, extension, resourcefirstname, resourcelastname
Order By Min(eventdatetime)

一切正常,但 Between 子句中的日期当前是手动输入的 - 不是最优的。我只需要一些方法来描述 "yesterday at 4:00 AM" 和 "Today at 4:00 AM" 有人能告诉我吗?

使用 Informix 版本 12.10.FC6DE,我可以这样做:

SELECT
    TODAY::DATETIME YEAR TO SECOND AS today_zerohour
    , TODAY::DATETIME YEAR TO SECOND  - '20:00:00'::INTERVAL HOUR TO SECOND AS yesterday_dawn
    , TODAY::DATETIME YEAR TO SECOND  + '04:00:00'::INTERVAL HOUR TO SECOND AS today_dawn
FROM
    systables
WHERE
    tabid = 1;

它 returns:

today_zerohour      yesterday_dawn      today_dawn

2016-10-21 00:00:00 2016-10-20 04:00:00 2016-10-21 04:00:00

那么,这里发生了什么:

  • 运算符TODAY return将系统日期设置为DATE类型。 DATE 类型没有我想要的精度(它只有年、月和日),因此我将值(转换运算符为 ::)转换为 DATETIME,精度为年秒(时分秒归零):

    TODAY::DATETIME YEAR TO SECOND

  • 在 Informix 中,对于 DATETIME 值与 return 另一个 DATETIME 值的加法或减法,我需要加减一个 INTERVAL 值。所以我创建了 2 INTERVAL 个值。

  • 从今天的值中减去 20 小时中的一个 INTERVAL(再次使用转换运算符 ::,这次是从字符串转换为 INTERVAL):

    '20:00:00'::INTERVAL HOUR TO SECOND

  • 4 小时中的一个 INTERVAL 添加到今天的值:

    '04:00:00'::INTERVAL HOUR TO SECOND