在where子句中查询日期和特定时间

时间:2018-10-22 18:07:23

标签: sql oracle date oracle-sqldeveloper

我正在寻找有关Oracle SQL的帮助。我需要在where子句中查询日期和时间,以根据当前日期查找班次数据。有3个班次,从早上5点到下午1点,从下午1点到9点以及从晚上9点到5点(第二天早上。例如

SELECT 'T1' AS SHIFT, WORK_CENTER, SUM(CASE WHEN AQL='PASS' THEN 1 ELSE 0) END AS AQL_PASSED
FROM Z_INSPECTION_DEFECTS
WHERE DATE_TIME >= TO_DATE((SELECT CONCAT(TO_CHAR(CURRENT_DATE, ''DD-MON-YYYY''), '' 5:00:00 '') FROM DUAL)  , ''DD-MON-YYYY HH:MI:SS '') AND
       DATE_TIME < TO_DATE((SELECT CONCAT(TO_CHAR(CURRENT_DATE, ''DD-MON-YYYY''), '' 1:00:00 '') FROM DUAL) , ''DD-MON-YYYY HH:MI:SS '')

此查询没有任何结果。日期时间字段是洛杉矶当地时间的时间戳。

1 个答案:

答案 0 :(得分:0)

直接的问题是,您正在寻找的时间是凌晨5点之后和凌晨1点之前,这在逻辑上意味着没有任何匹配-因为没有时间可以同时满足这两个条件。您可以改为使用24小时制:

import demoCmp from '../../src/processors/demo/demo'

describe('demo', () => {

    let result

    beforeEach(() => {
        result = demoCmp.generate([], [], {})
    })

    it('should return a non-null result', () => {
        expect(result).not.toBeUndefined()
    })
})

但是还有其他方法可以得到这些,例如只是没有针对WHERE DATE_TIME >= TO_DATE((SELECT CONCAT(TO_CHAR(CURRENT_DATE, ''DD-MON-YYYY''), '' 5:00:00 '') FROM DUAL) , ''DD-MON-YYYY HH24:MI:SS '') AND DATE_TIME < TO_DATE((SELECT CONCAT(TO_CHAR(CURRENT_DATE, ''DD-MON-YYYY''), ''13:00:00 '') FROM DUAL) , ''DD-MON-YYYY HH24:MI:SS '') 的查询:

dual

或采用截断和日期运算法则:

WHERE DATE_TIME >= TO_DATE(TO_CHAR(CURRENT_DATE, ''DD-MON-YYYY'') || '' 5:00:00 '', ''DD-MON-YYYY HH24:MI:SS '') AND
       DATE_TIME < TO_DATE(TO_CHAR(CURRENT_DATE, ''DD-MON-YYYY'') || ''13:00:00 '', ''DD-MON-YYYY HH24:MI:SS '')

您确实需要在目标时区获得这些时间,例如:

WHERE DATE_TIME >= TRUNC(CURRENT_DATE) + (5/24) AND
       DATE_TIME < TRUNC(CURRENT_DATE) + (13/24)

您需要注意当前会话时区中的WHERE DATE_TIME >= FROM_TZ(CAST(TRUNC(CURRENT_DATE) + (5/24) AS TIMESTAMP), ''America/Los_Angeles'') AND DATE_TIME < FROM_TZ(CAST(TRUNC(CURRENT_DATE) + (13/24) AS TIMESTAMP), ''America/Los_Angeles'') 和服务器时区中的current_date。如果您的会话是UTC,那么sysdate可能无法满足您的期望。

(我一直使用转义的单引号,因为这主要是您在问题中所遇到的,这意味着您可能正在使用动态SQL运行它;是否需要是另一回事。在运行时提供周期偏移,那么就不需要动态...)

您可以使用以下方法查看这些计算产生的时间:

current_date