我正在寻找有关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 '')
此查询没有任何结果。日期时间字段是洛杉矶当地时间的时间戳。
答案 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