복붙노트

[SQL] 지금 () 함수로부터 시간 빼기

SQL

지금 () 함수로부터 시간 빼기

우리는 기계 실행 연중 무휴 있습니다. 매일 나는 시간당 생산 조각의 수를보고합니다. 에서 우리의 경우 하나의 작업 일 수단 '2015년 6월 16일 6시 0분 0초'예 '2015년 6월 17일 6시 0분 0초'이다.

여기 내 코드는 다음과 같습니다

select date_trunc('hour', t_el_eventlog.eventtime at time zone 'CET') as hours,
       count (distinct t_el_eventlog.serialnumber) as count
from t_el_eventlog
where eventtime at time zone 'CET' between '2015-06-16 06:00:00'
                                       and '2015-06-17 06:00:00'
and sourceid = '44'
group by hours
order by hours asc

위의 쿼리와 함께 내가 원하는 정보를 얻을,하지만 난 매일 날짜를 변경해야합니다. 내 경우 디폴트 값 () 함수는 내가 날짜를 수동으로 매일을 변경할 필요가 없습니다 그래서, 대신에 이제 사용할 수 있습니까?

해결법

  1. ==============================

    1.당신은 시간대와 시간대와 타임 스탬프가없는 데이터 유형 타임 스탬프의 본질을 (이름은 속일 수) 이해할 필요가있다. 그렇지 않으면,이 첫 번째 읽기 :

    당신은 시간대와 시간대와 타임 스탬프가없는 데이터 유형 타임 스탬프의 본질을 (이름은 속일 수) 이해할 필요가있다. 그렇지 않으면,이 첫 번째 읽기 :

    상기 TIME ZONE 구조는 거의 확실히 잘못된 움직임이다 timestamptz로 타임 스탬프를 변환 :

    where eventtime at time zone 'CET' between '2015-06-16 06:00:00'
                                           and '2015-06-17 06:00:00'

    첫째, 성능을 죽인다. EVENTTIME에 AT TIME ZONE을 적용하면 식을 스 SARGable하지 있습니다. 포스트 그레스는 EVENTTIME에 일반 인덱스를 사용할 수 없습니다. 그러나 심지어 인덱스없이, 스 SARGable 표현은 저렴합니다. 당신이 모든 행을 조작 할 필요가 없습니다, 테이블의 값으로 조정 범위를 제공합니다. 당신은 일치 식 지수로 보정 할 수 있지만, 아마 오해와 잘못 어쨌든입니다.

    어떻게 그 표현에 어떻게됩니까?

    당신은 모든 곳에서 같은 시간대에 작동 할 경우 긴 이야기의 짧은 : CET 또는 '유럽 / 베를린', 같은 일을 현재의 타임 스탬프를 들어,하지만 역사 또는 (아마도) 미래의 것들에 대한, 당신은 단지 cruft에 잘라 수 있습니다.

    표현과 두 번째 문제는 : BETWEEN 거의 항상 타임 스탬프 값에 문제가 있습니다. 세부:

  2. ==============================

    2.귀하의 캔 사용 CURRENT_DATE :

    귀하의 캔 사용 CURRENT_DATE :

     select date_trunc('hour', t_el_eventlog.eventtime at time zone 'CET') as hours,
            count(distinct t_el_eventlog.serialnumber) as count
     from t_el_eventlog
     where eventtime at time zone 'CET' between CURRENT_DATE + interval '6 hour' and
                                                CURRENT_DATE + interval '30 hour' and
           sourceid = '44'
     group by hours
     order by hours asc;
    

    편집하다:

    어윈의 의견은 질문하지이 답변에 관한 것입니다. 날짜 사이에 사용 / 시간은 나쁜 생각이다. 나는이이 작업을 수행 모든 질문에 반복해야 가정합니다. 그러나 문제는 일의 경계입니다 날짜 / 시간 값을 두 번 계산하는 것입니다.

    올바른 논리는 다음과 같습니다

     select date_trunc('hour', t_el_eventlog.eventtime at time zone 'CET') as hours,
            count(distinct t_el_eventlog.serialnumber) as count
     from t_el_eventlog
     where eventtime at time zone 'CET' >= CURRENT_DATE + interval '6 hour' and
           eventtime at time zone 'CET' < CURRENT_DATE + interval '30 hour' and
           sourceid = '44'
     group by hours
     order by hours asc;
    

    은 "<"에 대한 두 번째 제한합니다. 다음은이 주제에 대한 좋은 블로그입니다. 아론은 SQL 서버에 초점을 맞추고 있지만, 경고 (및 솔루션의 일부는) 다른 데이터베이스에 적용뿐만 아니라.

  3. from https://stackoverflow.com/questions/30894296/subtract-hours-from-the-now-function by cc-by-sa and MIT license