2016-10-21 36 views
1

Informix不是我的正常环境,它处理日期时间值的方式会引发我循环。我无法想象这很难,但对于我的生活,我还没有弄明白。Informix - 需要为Where子句创建日期时间参数

这是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) 

一切正常原样,但在条款之间的日期目前进入manually-不是最佳的。我只需要一些方法来描述“昨天凌晨4点”和“今天凌晨4点”请问有人请我介绍一下吗?

回答

3

使用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; 

,并返回:

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退货系统日期为DATE类型。该DATE类型没有我想要的精度(它只有一年,月和日),所以我投的值(转换运算符是::)的DATETIME精度从今年第二(小时,分,秒设定零):

    TODAY::DATETIME YEAR TO SECOND

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

  • 一个20小时内从今天值减去INTERVAL(再次转换运算符::被使用时,该时间从字符串转换为一个INTERVAL):

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

  • 之一INTERVAL 4小时添加到今天值:

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

+0

谢谢路易斯,那确实有窍门。我看到它背后的逻辑,但仍然没有把握它的原因和方式。显然,太过困于MS SQL。无论如何,再次感谢 - 我的头可以停止伤害现在。 –

+0

@craigwhite我添加了一些信息,试图解释。 –

+0

这样做很整齐。 –