타 시스템과 Interface 또는 Background Job을 수행하는 트랜잭션 같은 경우
그 이력을 확인하기 위해 Monitoring 프로그램을 개발하게 된다.
이러한 Monitoring 프로그램에서 빠질 수 없는 조건이 바로 Period 기간인데,
일반적으로는 해당 트랜잭션이 발생한 날짜( Date )만 조회 조건에 넣지만
분/초 단위로 수시로 수행하는 트랜잭션인 경우에는 시간( Time )까지 조회조건을 넣게 된다.
날짜와 시간조건을 넣어달라는 개발 SPEC을 보고 항상 해오듯 의식의 흐름대로(?) 선택화면을 구현했다면, 위와 같이 구현을 했을 것이고, 데이터를 가져오는 부분 또한 의식의 흐름대로 SQL을 작성했다면 다음과 같을 것이다.
SELECT ~
FROM 트랜잭션 테이블
WHERE date IN @s_date
AND time IN @s_time ~
여기서 2가지 문제점이 있다.
첫 번째는 선택화면( SELECTION SCREEN )의 시간( Time ) 조건에서
낮 13:00:00 ~ 새벽 01:00:00( 다음날 ) 와 같이 날이 넘어가서 HIGH 값이 LOW값보다 작아지는 경우 ,
SELECT-OPTIONS의 LOW값이 HIGH값보다 클 수 없다는 기본 스탠다드 유효성 점검에 의해 입력이 불가하다.
두 번째, SQL 쿼리 문에서는
위 SELECTION SCREEN 예시에 2023.01.01 15시 ~ 2023.01.31 19시 의 데이터를 보고자 할 때,
예시와 같이 쿼리처럼 작성했다면,
2023.01.01 ~ 2023.01.31 기간 중에서 15시 ~ 19시 시간 사이의 데이터만 가져오게 된다.
그 외 시간대 데이터는 누락하는 오류가 발생한다.
이럴 때는 SELECT-OPTIONS 이 아닌 PARAMETERS 를 이용, 날짜와 시간을 하나의 SET로 선택화면을 구현하면, 가시성도 좋고 스탠다드의 기본 유효성 체크 기능에서도 벗어날 수 있다.
( 단, 조금 더 손이 간다는 단점은 있... )
SQL 쿼리문은 다음과 같이 해결 할 수 있다.
SELECT ~
FROM 트랜잭션 테이블
WHERE ( date > @Start Date OR ( date = @Start Date AND time >= @Start Time ) )
AND ( date < @End Date OR ( date = @End Date AND time <= @End Time ) ) .