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
날짜 시간 데이터 유형을 사용할 때는 좀 심합니다. 저장된 기능에 적합한 후보입니다.
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
'programing' 카테고리의 다른 글
안드로이드 및 dp 단위로 프로그래밍된 폭 및 높이 설정 (0) | 2023.10.15 |
---|---|
Link="preload"가 추가되었지만 페이지 속도에서 감지되지 않음 (0) | 2023.10.15 |
부트스트랩과 아이오닉의 차이점 (0) | 2023.10.15 |
다음 클라우드가 도커에서 데이터베이스를 찾지 못하는 이유는 무엇입니까? (0) | 2023.10.15 |
이 핸들러 클래스는 정적이어야 합니다. 그렇지 않으면 누출이 발생할 수 있습니다.들어오는 처리기 (0) | 2023.10.15 |