Ruby on Rails'te DateTime, Zaman Damgası, Saat ve Tarih arasındaki fark nedir?


414

Deneyimlerime göre, programlama sırasında tarih / saatleri doğru yapmak her zaman tehlike ve zorluklarla doludur.

Ruby ve Rails her zaman beni bunlardan kaçtılar, ancak çok sayıda seçenek nedeniyle; Hangisini seçmem gerektiği konusunda hiçbir fikrim yok.

Rails kullanırken ve ActiveRecord veri tiplerine bakarken aşağıdakileri bulabilirim

: datetime,: zaman damgası,: saat ve: tarih

ve farkların ne olduğu veya gotchaların nerede gizlendiği hakkında hiçbir fikriniz yok.

Fark ne? Onları ne için kullanıyorsun?

(PS Rails3 kullanıyorum)

Yanıtlar:


572

ActiveRecord'daki farklı tarih / saat biçimleri arasındaki farkın Rails ile ilgisi yoktur ve hangi veritabanını kullanırsanız kullanın.

(Eğer en popüler olduğundan başka bir nedenle) bir örnek olarak MySQL kullanarak, sahip DATE, DATETIME, TIMEve TIMESTAMPkolon veri tipleri; tıpkı sahip olduğunuz CHARgibi VARCHAR, FLOATve INTEGER.

Öyleyse sor, fark nedir? Bazıları açıklayıcı. DATEyalnızca bir tarih depolar, TIMEyalnızca günün bir saatini DATETIMEdepolar, her ikisini de depolar.

Arasındaki fark DATETIMEve TIMESTAMPbiraz daha ince olduğu: DATETIMEolarak biçimlendirilir YYYY-MM-DD HH:MM:SS. Geçerli aralıkları 9999 (ve arasındaki her şeyi her yıl 1000 gidin. Ederken TIMESTAMP görünüyor Eğer veritabanından getir zaman benzer, gerçekten için adil bir öncü Unix zaman damgası . Onun geçerli aralık 1970 den 2038 fark gider burada, dahili veritabanı motoru içinde fonksiyonlar, depolama alanı çeşitli olduğunu bir kenara gelen. Çünkü DATETIMEher yıl, ay gün, saat, dakika basamaklı ve ikincisi, 8 bayt toplam kullanır mağazalarında. gibi TIMESTAMPsadece sayı depolayan 1970-01-01'den bu yana saniye cinsinden 4 bayt kullanır.

MySQL'de saat formatları arasındaki farklar hakkında daha fazla bilgiyi buradan edinebilirsiniz .

Sonunda, tarih / saat sütununuz için ihtiyacınız olan şeylere gelir. Tarih ve saatleri 1970'den önce veya 2038'den sonra mı depolamanız gerekiyor? Kullanın DATETIME. Veritabanı boyutu hakkında endişelenmeniz gerekiyor mu? Kullanın TIMESTAMP. Yalnızca bir tarih depolamanız mı gerekiyor? Kullanın DATE. Sadece bir zaman depolamanız mı gerekiyor? Kullanın TIME.

Tüm bunları söyledikten sonra, Rails aslında bu kararların bazılarını sizin için verir . Her ikisi de :timestampve :datetime, varsayılan olarak sırasıyla ve DATETIMEiken :dateve :timekarşılık gelir .DATETIME

Bu, Rails içinde yalnızca tarih, saat veya her ikisini birden saklamanız gerekip gerekmediğine karar vermeniz gerektiği anlamına gelir.


7
Kayıt için, YYYY-AA-GG biçimi kullanılan zaman dilimine bağlı olduğundan mutlak zaman damgalarını (unix) tercih ederim. Bu nedenle, istemcinin sunucunun saat dilimini bilmesi ve dönüşüm yapması gerekir. 1970'den bu yana geçen saniye sayısı mutlak zaman damgalarında bu sorun yoktur.
n13

32
@ n13 İyi bir nokta, ancak Rails'te gerçekten bir sorun değil, çünkü veritabanına dattime eklemeden önce UTC'ye dönüşüyor.
vonconrad

13
Bu, Rails evrenindeki en yararlı gönderilerden biridir. Bu ray kılavuzuna eklenmelidir ...
Andrew

4
MySQL'in TIMEsütunu kesinlikle "günün saati" değildir, çünkü> 24 saati kabul eder; "geçen süre" olarak da kullanılabilir.
nickgrim

6
Bu diğer dbs'de aynı mıdır? örneğin postgres?
Andy Hayden

24
  1. : datetime (8 bayt)

    • Mağazalar Tarih ve Saat Biçimlendirilmiş YYYY-AA-GG SS: DD: SS
    • Birth_date gibi sütunlar için kullanışlıdır
  2. : zaman damgası (4 bayt)

    • 1970-01-01'den bu yana saniye sayısını saklar
    • Updated_at, created_at gibi sütunlar için kullanışlıdır
  3. : tarih (3 bayt)
    • Mağaza Tarihi
  4. : zaman (3 bayt)
    • Mağaza Zamanı

3
Bu daha çok yukarıdaki kabul edilen cevabın TL: DR versiyonu gibi
Chidozie Nnachor

0

İşte bulduğum harika ve kesin bir açıklama.

TIMESTAMP, kayıt değişikliklerini izlemek ve kayıt her değiştiğinde güncellemek için kullanılır. DATETIME, kayıtlardaki değişikliklerden etkilenmeyen belirli ve statik değeri depolamak için kullanılır.

TIMESTAMP ayrıca TIME ZONE ile ilgili farklı ayarlardan da etkilenir. DATETIME sabit.

TIMESTAMP dahili olarak geçerli bir saat dilimini depolama için UTC'ye dönüştürdü ve alma sırasında geri geçerli saat dilimine dönüştürün. DATETIME bunu yapamaz.

TIMESTAMP 4 bayt ve DATETIME 8 bayttır.

TIMESTAMP desteklenen aralık: '1970-01-01 00:00:01 ′ UTC -' 2038-01-19 03:14:07 ′ UTC DATETIME desteklenen aralık: '1000-01-01 00:00:00 ′ -' 9999 -12-31 23:59:59 ′

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

Ayrıca...

farklı sütun "tarih" türleri ve karşılık gelen raylar veritabanına bağlı geçiş türleri içeren tablo

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.