Ruby on Rails에서 DateTime, Timestamp, Time 및 Date의 차이점은 무엇입니까?


414

내 경험상 프로그래밍 할 때 항상 날짜와 시간을 얻는 것은 항상 위험과 어려움으로 가득 차 있습니다.

루비와 레일즈는 압도적으로 많은 옵션으로 인해 항상 이것에 대해 뛰어 들었습니다. 나는 어떤 것을 골라야할지 전혀 모른다.

Rails를 사용하고 ActiveRecord 데이터 유형을 볼 때 다음을 찾을 수 있습니다

: datetime, : timestamp, : time 및 : date

차이점이 무엇인지, 문제가 어디에 있는지 모릅니다.

차이점이 뭐야? 무엇을 위해 사용합니까?

(PS 저는 Rails3을 사용하고 있습니다)

답변:


572

ActiveRecord의 서로 다른 날짜 / 시간 형식의 차이는 Rails와 거의 관련이 없으며 사용중인 데이터베이스와 관련이 있습니다.

(만약 그것이 가장 인기 때문에 다른 이유로) 예로 MySQL을 사용하여, 당신은 DATE, DATETIME, TIMETIMESTAMP열 데이터 유형; 당신이 가지고있는 것과 같이 CHAR, VARCHAR, FLOATINTEGER.

차이점이 무엇인지 물어보십시오. 글쎄, 그들 중 일부는 설명이 필요합니다. DATE날짜 TIME만 저장하고 시간 만 저장하며DATETIME 둘 다 저장합니다.

의 차이 DATETIME와는 TIMESTAMP좀 더 미묘하다 : DATETIME로 포맷됩니다 YYYY-MM-DD HH:MM:SS. 유효한 범위는 1000 년에서 9999 년 사이입니다 (그리고 그 사이의 모든 것). 데이터베이스에서 가져올 때와 TIMESTAMP 비슷해 보이지만 실제로는 유닉스 타임 스탬프 의 최전선입니다 . 유효한 범위는 1970에서 2038 사이입니다. 여기에는 데이터베이스 엔진의 다양한 내장 기능 외에도 저장 공간이 DATETIME있으며, 년, 월, 일,시, 분 및 초의 모든 자릿수를 저장하므로 총 8 바이트를 사용합니다.TIMESTAMP 단지 수를 저장 1970-01-01 이후 초 단위로 4 바이트를 사용합니다.

MySQL 에서 시간 형식의 차이점에 대한 자세한 내용은 여기를 참조하십시오. .

결국, 그것은 당신이해야 할 일 / 시간 열에 달려 있습니다. 1970 년 이전 또는 2038 년 이후의 날짜와 시간을 저장해야합니까? 사용하십시오 DATETIME. 데이터베이스 크기에 대해 걱정해야하며 해당 시간 범위 내에 있습니까? 사용하십시오 TIMESTAMP. 날짜 만 저장해야합니까? 사용하십시오 DATE. 당신은 시간을 저장해야합니까? 사용하십시오 TIME.

이 모든 것을 말하면 Rails는 실제로 이러한 결정 중 일부를 결정합니다 . 모두 :timestamp:datetime기본값으로 사용됩니다 DATETIME동안, :date:time대응을 DATE하고 TIME, 각각.

즉, Rails 내에서 날짜, 시간 또는 둘 다를 저장할지 여부 만 결정하면됩니다.


7
YYYY-MM-DD 형식은 사용 된 시간대에 따라 다르므로 레코드의 경우 절대 타임 스탬프 (유닉스)를 선호합니다. 따라서 클라이언트는 서버의 시간대를 알아야하고 변환을 수행해야합니다. 초부터 1970 년까지 절대 타임 스탬프에는 그 문제가 없습니다.
n13

32
@ n13 데이터베이스에 날짜 / 시간을 삽입하기 전에 UTC로 변환되므로 레일스에서는 문제가되지 않습니다.
vonconrad

13
이것은 Rails 세계에서 가장 유용한 게시물 중 하나입니다. 이것은 레일 가이드에 추가되어야합니다 ...
Andrew

4
MySQL의 TIME열은 24 시간 이상을 허용하기 때문에 엄격하게 "시간"이 아닙니다. "경과 시간"으로도 사용할 수 있습니다.
nickgrim

6
다른 DB에서도 마찬가지입니까? 예를 들어 postgres?
Andy Hayden

24
  1. : 날짜 시간 (8 바이트)

    • YYYY-MM-DD HH : MM : SS 형식의 날짜 및 시간 저장
    • birth_date와 같은 열에 유용
  2. : 타임 스탬프 (4 바이트)

    • 1970-01-01 이후의 초 수를 저장합니다
    • updated_at, created_at와 같은 열에 유용합니다.
  3. : 날짜 (3 바이트)
    • 매장 날짜
  4. : 시간 (3 바이트)
    • 매장 시간

3
이것은 위의 허용 된 답변의 TL : DR 버전과 비슷합니다.
Chidozie Nnachor

0

내가 찾은 굉장하고 정확한 설명입니다.

TIMESTAMP는 레코드 변경을 추적하고 레코드가 변경 될 때마다 업데이트하는 데 사용됩니다. DATETIME은 레코드 변경에 영향을받지 않는 특정 정적 값을 저장하는 데 사용됩니다.

TIMESTAMP는 또한 다른 TIME ZONE 관련 설정의 영향을받습니다. DATETIME은 일정합니다.

TIMESTAMP는 저장을 위해 내부적으로 현재 시간대를 UTC로 변환했으며 검색하는 동안 현재 시간대로 다시 변환합니다. DATETIME은이 작업을 수행 할 수 없습니다.

TIMESTAMP는 4 바이트이고 DATETIME은 8 바이트입니다.

TIMESTAMP 지원 범위 : '1970-01-01 00:00:01'UTC ~ '2038-01-19 03:14:07'UTC DATETIME 지원 범위 : '1000-01-01 00:00:00'~ '9999 -12-31 23:59:59 ′

출처 : https://www.dbrnd.com/2015/09/difference-between-datetime-and-timestamp-in-mysql/#:~:text=DATETIME%20vs%20TIMESTAMP%3A,DATETIME%20is%20constant .

또한...

데이터베이스에 따라 다른 열 "날짜"유형 및 해당 레일 마이그레이션 유형을 가진 테이블

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.