2009-10-08 6 views
5

어리석은 쉬운 문제지만, 나는 우아한 해결책을 찾을 수 없었습니다. 예를 들어, MySQL 열에 시간 간격을 저장하려고합니다.MySQL에서 시간 간격 값을 저장하는 가장 좋은 방법은 무엇입니까?

1:40 (1 시간 40 분) 0:30 (30 분).

그런 다음 쿼리를 실행하여 합계 할 수 있습니다. 지금은 INT 값 (1.40)으로 저장하지만 수동으로 추가해야합니다 (쉬운 방법이 없으면 제외).

TIME 열 유형은 900 시간까지만 저장할 수 있기 때문에 시간이 수십만 개가 넘는 것을 추적 할 수 있으므로 (거의) 쓸모가 없습니다. (여러 필드의 합계를 사용하여 한 필드를 저장합니다. 항목).

감사합니다.

답변

8

은 분만 저장하므로 1:40은 100으로 저장됩니다. 이는 쉽게 추가 할 수 있습니다 : 100 + 30 = 130. 표시 할 때 다시 시간 : 분으로 변환 할 수 있습니다. 130 분 -> 2:10.

+0

나는 나의 합이 모든 부분 분을 잃지 않도록 그러나 내가 대신 초를 저장, 내 애플 리케이션 중 하나에 비슷한 일을했다. –

+2

예, 초를 추적해야하는 경우 초를 수행하십시오. 그러나 질문은 분에 대해서만 묻습니다. 당신이 반올림 오류로 실행될 수 있습니다 부동 값, 전자 등의 시간을 저장할 때 – longneck

4

나는 INT 필드에 초 또는 분 (또는 작업하는 가장 낮은 시간 값)으로 저장합니다.

예로서, 다음과 같은 시간 값을 1 시간 34 분 25초를 저장할 :

5천6백65초이다

. 3,367초있어

: 그래서 그냥

나중에 INT 필드에서 5665으로 값을 저장, 당신은 시간 값을 56 분 칠초를 저장할 말할 수 있습니다. 나중에

합계까지 모든 것을 : 다시 시간, 분, 초, 당신은 2 시간 30 분 32초을 얻을

변환 5665 + 3367 = 9,032초. 예, 변환을 수행하기 위해 수학을 수행해야하지만 매우 간단한 계산 방법이며 INT를 검색 한 후에 INT 또는 한 번 저장하기 전에 한 번만 수행하므로 기계 집약적 인 것은 아닙니다.

4

특히및 DATE_SUB은 날짜와 날짜/시간 형식과 함께 정수 단위를 사용할 수 있으므로이 필드에는 int 필드를 사용할 수 있습니다. 당신이 시간 그들을 저장하려면

DATE_ADD(eventDateTime,INTERVAL durationMinutes MINUTE) 
+0

니스, 당신은뿐만 아니라 – Va1iant

0

, 따라서 정수를 유지 : 당신이 날짜 열 eventDateTime이 있고 기간 열 durationMinutes이있는 경우

는 예를 들어, 사용 종료 날짜를 계산할 수 있습니다 작은 경우 분 수를 60으로 나눌 수 있습니다.

이렇게 1:40은 100/60 = 1.66이되고 30은 60/5가됩니다.이제 당신은 일반적으로 그들을 추가 할 수 있습니다 : 그 것 때문에,

1.66 + .5 = 2.16 

을 한 다음은 전체 시간의 수를 가지고 있고, 소수점 이하 부분은 60 분의 수입니다

.16 * 60 = 10 

은 그래서 당신의 다음 최고의 옵션은 MySQL이 base60을 할 수 있는지 2시 10분

입니다입니다.

+1

쿼리를 보여줍니다. 지. 100 분은 정확히 1.66 시간이 아닙니다. 추가 작업을 수행하면 오류가 커집니다. – joschi

+0

왜 떠 다니는가? 초를 원한다면 초를 저장하십시오. 심지어 32 비트로 충분하기 때문에 반올림 오류가 발생하지는 않습니다. 밀리 초 동안 64 비트 int 유형 (대부분의 SQL 데이터베이스에서 BIGINT)이 있습니다. – Frizi

+0

초 단위가 아님. 그리고 op는 몇 시간을 기본으로 시간을 저장하는 방법을 요구했습니다 (따라서 분은 기본의 일부일 것입니다). 수레가 왜 이상적 이었는지를 기억하지 마십시오. – Anthony

0

나는이 얘기하는 시간 간격의 종류, 내가이 문제를 검색 할 때 때 내가 게시 할 것이라고 생각 때문에 자신과 같은 다른 잃어버린 영혼을 도와, 내가 찾은에만 관련 SO 질문에 관한 아니라는 것을 알고 내가 지금하고있는 일.

차라리 "(초)"또는 분 등보다 정확한 값 중 하나 일개월 또는 인 정액제 길이를 저장하고있다. 그래서 내 경우에는 내가 "기간"INT와의 "duration_unit"ENUM은 ('일', '달')이있다.

"6 개월"구독의 경우 6 개월 동안의 통화량 (6 개월 동안의 통화량에 따라 달라질 수 있음)을 계산하지 않고 "6"및 "개월"만 저장합니다.

PHP의에서는 mktime() 메소드와

이 쉽고 6개월의 시간 간격을 계산하는 것이 더 정확하다.

관련 문제