2012-01-11 27 views
1

我试图做一个SQL报告,其中字段x在2个不同的行(如同一个名称)相同,提交y是相同的2个不同的行(如状态),但字段z是一秒差(进入工作时间)。 z的格式是hhmmss。有人可以帮我弄这个吗?SQL报告x和y字段相同,z与1秒差异

+0

你正在使用哪些DBMS?日期时间操作函数在它们之间有所不同。 – 2012-01-11 09:50:20

+0

什么是您的RDBMS? – 2012-01-11 09:50:29

+0

我需要在一个控制访问系统(Picture Perfect)中使用REDHAT LINUX环境中的INFORMIX数据库。 – 2012-01-11 10:41:08

回答

1

假设领域NAME(X),STATUS(y)和TIME(z)和假设TIME是:

select t1.* from tablename t1 
inner join tablename t2 
    on t1.NAME = t2.NAME 
    and t1.STATUS = t2.STATUS 
    and t1.TIME = t2.time - 1 UNITS SECOND 
+0

在Informix中,您不需要DATEADD;你可以写't2.time - 1 UNITS SECOND'或者't2.time - INTERVAL(1)SECOND'。 – 2013-02-01 20:09:56

+0

@JonathanLeffler谢谢,取而代之:) – 2013-02-08 16:43:30

0

我从来没有用过的Informix,但我认为以下查询应该罚款。它应该返回两个扫描中的第一个。请注意,如果扫描之间的间隔长于1秒,则不会显示。

select t.name, t.status, t.data_field, t.time_field 
from tab t 
left join tab t1 on (
     t.name = t1.name and 
     t.status = t1.status and 
     t.data_field = t1.data_field and 
     (substring(t.time_field from 1 to 2)::INTEGER) * 3600 + 
     (substring(t.time_field from 3 to 2)::INTEGER) * 60 + 
     (substring(t.time_field from 5 to 2)::INTEGER) + 1 = 
     (substring(t1.time_field from 1 to 2)::INTEGER) * 3600 + 
     (substring(t1.time_field from 3 to 2)::INTEGER) * 60 + 
     (substring(t1.time_field from 5 to 2)::INTEGER) 
    ) 

它采用substring功能和casting为varchar时间转换成秒。

+0

Informix DATETIME值不是VARCHAR,虽然它们可以被强制转换为VARCHAR,并且SUBSTR(而不是SUBSTRING)会在纯时间(DATETIME HOUR TO SECOND)字段中进行转换。如果它是DATETIME YEAR TO SECOND或类似的东西,事情就会不那么开心 - 但主要是调整范围的问题。 – 2013-02-08 19:00:23

相关问题