Tarihler bir DateTime olarak veya SQL bir int olarak saklanmalıdır?

12 Cevap php

I store all my dates for post in my forum in datetime (0000-00-00 00:00:00). I see that phpBB, punBB and all popular forums store dates in int?

Ne daha iyi?

12 Cevap

Bir datetime, içten, bir int, bazı epoch adlı saniye veya milisaniye sayısı, 1 Ocak 1970 geceyarısı genellikle linux çağı olduğunu.

Ama (tüm bu fonksiyonları kendinizi yeniden yazmadan) bir int ile yapamazsınız zaman aralıklarını, toplama, çıkarma, ve ayrıştırmak için size harika tarih fonksiyonları her türlü sağlar.

Yani hiçbir şey kaybetme, ve diğerleri bir tarih / datetime yerine bir int kullanarak, cevap gibi bir çok kazanıyor ediyoruz.

Ben örneğin bir int olarak tarihlerini depolayan bir veri ambarı ile çalışmak 20090331 biçimi. Sonra dönüşüm adanmış bir tablo var ki datetime temsilin dahil olmak üzere herhangi bir tarih ile ilgili bilgi için int. Bu esneklik bir sürü sağlar ve sadece tarih masaya katılmak, tamsayı tarih şey ama ihtiyacınız varsa bizimle vb çeyrek numarası, tatil atama, gibi ekstra bilgi eklemenizi sağlar.

select MyTable.Stuff,DimDate.AsDateTime,DimDate.BusinessQuarter,DimDate.IsHoliday from MyTable
inner join DimDate on MyTable.DateKey = DimDate.DateKey

SQL 2008 bir "tarih" veri türü, bu tam bir "datetime" alanına daha küçük tanıttı, size bir INT kullanma hakkında düşünme eğer ihtiyacınız yok gibi, zaten sesler, saat bölümünü (gerekmiyorsa .)

Ayrıntılar için this article bakın.

Ben tpdi cevabı takip ve her iki yolu birkaç kez yaptıktan benim deneyim açıklamak istiyorum.

1970 civarında zaman içinde bir noktada geçmişte belirli bir saniye sayısı - bir tamsayı kullanılır olmuştur, bu tpdi tarafından açıklanan kongre ile yapılır oldu.

Geri üretim yazılımı bir çok en azından kısmen C yazılmış iken, bu modu standart (UNIX-tarzı) ve fonksiyonların bir makul sayıda haritalama ve tarih hesaplamaları için verilmiştir.

Çok üzerinde tartışılan değil bir konu saat, dakika ve saniye ile interpolasyonları eşit tüm dillerde ve VTYS kütüphaneler tarafından iyi ele olmamasıdır. Tamsayı tabanlı tarihleri ​​hataları yuvarlama endişesi olmadan daha güzel bu işlemek - en azından uzun bir çözünürlük az 1 saniyeden daha ihtiyaç yok gibi. Negatif tamsayılar ile çok fazla sorun olmadan ele alınabilir olsa da, 0 önceki tarihler ile uğraşmak zorunda değil, aynı zamanda yararlı olur.

Nihai yarar, çoğu dil / DBMSs daha kolay daha az uyumluluk sorunları ile birden çok dil ve VTYS ürünleri kullanmak için yapar bu kongre, taşıma için bir özelliği var olabilir.

@ Tpdi desribes gibi bazı makul durumlarda bu kadar; ama aynı zamanda onun başının açık olması - Eğer onlar içeriği sığacak eğer tamsayı tarihsaat işlemek kütüphaneleri aracılığıyla hassasiyet ve çapraz dil uyumluluğu kaybedebilir.

other dates olmadıkça ben Datetime kullanmak istiyorsunuz ve muhtemelen times daha iyi int olarak saklanabilir.

Bilginize, int / damgası ile giderseniz o zaman hala RDBMS Tarih / Saat için sunabileceği tüm işlevselliği alabilirsiniz. Örneğin MySQL, bir tamsayı zaman damgası alır ve bir DATETIME daha sonra bunu sizin gibi kullanabilirsiniz lütfen döndürür FROM_UNIXTIME(timestamp) hangi vardır.

Uzun bir tartışma için, hiçbir yerde başka Drupal projesi ince millet daha iyidir: http://groups.drupal.org/node/731

Umarım bu yardımcı olur.

Eğer INT olarak tarihlerini depolamak sonra hiç veritabanına bağlanan her uygulama ya da aracı anlamlı bir şey olduğunu INT dönüştürmek bilmek zorundadır. Ben özel RDBMS belirli bir veri türü ile ciddi kusurları vardır sürece verileri uygun veri türleri ile yapışmasını öneririm.

Eğer INT olarak saklayın eğer o zaman da pek çok tarih-belirli fonksiyonlara erişimi kaybedecek ve bunları kendiniz yazmak zorunda ... düşünün bir daha sorun. Örneğin, belirli bir tarihin gün adını (vb Pazartesi, Salı,) dönen.

"Iyi" bir cevabı varsa ben emin değilim. Eğer bir int olarak saklandığı takdirde, size Year 2038 issue. ile dertte olabilir çünkü Ama, datetime tavsiye ederim

Ben zaman tüm alanların DATETIME kullanmak (ve MySQL kullanarak, ben her zaman, her ZAMAN kaçının). Kullandığım Bir hile olsa da, NULL DEFAULT NULL sütun ayarlamaktır. Bu şekilde, şimdiye kadar endişelenecek ya da ben tarih boş veya boş dikkate örnekleri için "0000-00-00 00:00:00" kontrol etmek gerekmez; Ben sadece IS NULL için kontrol edin.

Bir anda, DATETIME (ve DATE ve TIME) MySQL ile içten dizeleri olarak hayata geçirilmiştir çünkü o insanlar düşünebilirsiniz tek nedeni, geçmişte, kendi tarih sütunları için INT kullanarak kabul olabilir olduğunu. Bu bağlamda, DATETIME alanları INT alanlarda çok daha büyük olurdu, ve uzay bir endişe eğer öyleyse ben bu kararı görebiliyordu. Bu gün, o (Ben MySQL 4.x söylemek ve olurdu) artık böyle değil, ve artık DATETIME seçmek için değil iyi bir neden yoktur.

Ayrıca, ön-dönem tarihleri ​​ile sorun var. Bazı üyeler 1 Ocak 1970 tarihinden önce doğmuş olabilir çünkü INT üye doğum tarihleri ​​gibi bir şey tutmak zordur.

Çoğu DBMSs günümüzde gerçek datetime alanlara karşı daha korkak sorguları yapalım. Tarih manipülasyon ve sorgulamak için kullanılabilir fonksiyonları ile bu sayıların kullanımını haklı zordur.

Ben birkaç veritabanı motorları arasında uygulamak kolay gibi BB sistemlerinin çoğu IntS kullanmak olduğunu hayal ediyorum, ve sadece zaman kısmı tarih bölümünde umurumda değil, eğer tarihsaat karşıt olarak (IntS itibaren marjinal daha iyi performans alabilirsiniz ) normalde 8 bayt yüzer olan.

Şahsen ben hemen hemen hiç bir DB platformdan diğerine göç nedeniyle, datetime alanlarda tarihleri ​​depolamak için tercih ve faydaları örneğin her ayın son Cuma DB sormak vardır.

En iyi cevap "değişir" dir. Başka hiçbir bilgi verilmedi, ben datetime daha iyi olduğunu söyleyebilirim. Daha iyi, daha olgun veri türlerini tanıyan bir başarısızlık olarak bu forumların uygulamaları görüyoruz. Eğer tarihler üzerinde İnts neden isteyeyim gerçekten iyi bir neden ile gelmek olurdu. Belki de var ve ben sadece bilmiyorum.