programing

MYSQL 날짜 시간 반올림에서 가장 가까운 시간

powerit 2023. 10. 15. 18:08
반응형

MYSQL 날짜 시간 반올림에서 가장 가까운 시간

MySQL 데이터베이스에 날짜 시간 필드가 있으며 가장 가까운 시간에 결과를 출력하고자 합니다.

를 들면 2012-04-01 00:00:01 합니다2012-04-01 00:00:00

업데이트: 저는 https://stackoverflow.com/a/21330407/480943 이 더 나은 답이라고 생각합니다.


날짜 연산을 통해 할 수 있습니다.

SELECT some_columns,
    DATE_ADD(
        DATE_FORMAT(the_date, "%Y-%m-%d %H:00:00"),
        INTERVAL IF(MINUTE(the_date) < 30, 0, 1) HOUR
    ) AS the_rounded_date
FROM your_table

설명:

  • DATE_FORMAT:DATE_FORMAT(the_date, "%Y-%m-%d %H:00:00")날짜를 가장 가까운 시간으로 잘라냅니다(분 및 초 단위를 0으로 설정).

  • 미닛:MINUTE(the_date)날짜의 분 값을 가져옵니다.

  • IF: 이것은 조건입니다. 파라미터 1의 값이 참이면 파라미터 2를 반환하고, 그렇지 않으면 파라미터 3을 반환합니다. 따라서IF(MINUTE(the_date) < 30, 0, 1) 그렇지 minute이 30이면 0하고,면 1합니다를 합니다.이것이 우리가 반올림할 때 사용할 것입니다. 다시 추가할 시간입니다.

  • DATE_ADD: 라운드에 대한 시간이 결과에 추가됩니다.

한 시간의 반은 30분입니다.타임스탬프를 30분 추가하고 분과 초를 잘라내기만 하면 됩니다.

SELECT DATE_FORMAT(DATE_ADD(timestamp_column, INTERVAL 30 MINUTE),'%Y-%m-%d %H:00:00') FROM table

소울의 첫 번째 솔루션은 반올림 대신 잘라내고 두 번째 솔루션은 다음과 같은 일광 절약의 경우에는 작동하지 않습니다.

select FROM_UNIXTIME(UNIX_TIMESTAMP('2012-03-11 2:14:00') - MOD(UNIX_TIMESTAMP('2012-03-11 2:14:00'),300));

다음은 대체 방법(1)입니다.

DATE_ADD(
    tick,
    INTERVAL (IF((MINUTE(tick)*60)+SECOND(tick) < 1800, 0, 3600) - (MINUTE(tick)*60)+SECOND(tick)) SECOND
)

몇 초 동안 걱정할 필요가 없다면 다음과 같이 간소화할 수 있습니다(2).

DATE_ADD(
    tick,
    INTERVAL (IF(MINUTE(tick) < 30, 0, 60) - MINUTE(tick)) MINUTE
)

또는 둥글게 자르는 대신 잘라내는 것을 선호한다면, 소울의 방법의 간단한 버전이 여기 있습니다(3).

DATE_SUB(tick, INTERVAL MINUTE(tick)*60+SECOND(tick) SECOND)

편집: 로컬 컴퓨터에서 이러한 쿼리의 일부를 프로파일링한 결과 100,000개의 행에 대한 평균 시간은 다음과 같습니다.

  • UNIXTIME하지 않음법: 0.0423ms만 DST음)
  • 내 방법 3: 0.1255ms
  • 내 메서드 2: 0.1289ms
  • DATE_FORMAT : : 0.1495ms
  • 내 방법 1: 0.1506ms

MySQL에서 날짜 시간을 반올림하는 방법:

날짜 시간 데이터 유형을 사용할 때는 좀 심합니다. 저장된 기능에 적합한 후보입니다.

DATE_SUB(DATE_SUB(time, INTERVAL MOD(MINUTE(time),5) MINUTE ), 
         INTERVAL SECOND(time) SECOND)

UNIXTIME 타임스탬프를 사용하면 더 쉽지만 1970년에서 2038년 사이의 날짜 범위로 제한됩니다.

FROM_UNIXTIME(UNIX_TIMESTAMP(time) - MOD(UNIX_TIMESTAMP(time),300))

행운을 빌어요.

현재 시간으로 반올림하려면 다음을 선택합니다.

FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(column_name) / 3600) * 3600).

값은 현재 시간대 문서에 표시됩니다.

한 뒤면 입니다입니다. ,'2012-01-02 18:02:30'다로 됩니다.'2012-01-02 19:00:00'

TIMESTAMPADD(HOUR,
    TIMESTAMPDIFF(HOUR,CURDATE(),timestamp_column_name),
    CURDATE())

에.CURDATE():다)를 사용할 수 .'2000-01-01'다를 하는 데 가 있을 수 .CURDATE()함수에 대한 두 호출 사이에 시스템 날짜가 변경되는 경우, Mysql이 두 호출을 동시에 수행할지 여부를 알 수 없습니다.

가장 가까운 시간은 다음과 같습니다.

TIMESTAMPADD(MINUTE,
    ROUND(TIMESTAMPDIFF(MINUTE,CURDATE(),timestamp_column_name)/60)*60,
    CURDATE())

60을 15로 바꾸면 가장 가까운 15분 간격을 얻을 수 있고, 세컨드를 사용하면 원하는 가장 가까운 두 번째 간격을 얻을 수 있습니다.

이전 시간 사용을 가져오려면TRUNCATE()아니면FLOOR()대신에ROUND().

도움이 되길 바랍니다.

시간만 다음 시간으로 반올림해야 하는 경우 다음을 사용할 수 있습니다.

SELECT TIME_FORMAT(
  ADDTIME(
    TIMEDIFF('16:15', '10:00'), '00:59:00'
  ),
  '%H:00:00'
)

이것이 가장 좋은 방법이라고 생각합니다. 가장 적은 양의 자원을 사용하기 때문입니다.

date_add(date(date_completed), interval hour(date_completed) hour) as date_hr

언급URL : https://stackoverflow.com/questions/9680144/mysql-date-time-round-to-nearest-hour

반응형