MySQL ve PHP uygulamada Datetime vs Timestamp?


24

Veri tipimi tarih veya zaman damgası olarak nasıl belirteceğimi bilmiyorum, ikisine de ihtiyacım olacak ama farklı olaylarda. Web sitem dünya çapında ürün ve hizmetler satmaktadır ve ayrıca kullanıcının giriş yapması için bir hesap sistemine sahiptir. Lütfen aşağıdakileri açıklığa kavuşturun:

  • Şu anki tarih ve saatte müşteri web sitemden ürün satın alıyor: Datetime?
  • Teslim tarihi ve saati bulundukları yere ve satın alınan tarih ve saate göre, sistemimizden hesaplanan: Datetime?
  • Son giriş yaptıkları hesapta: Timestamp?

    1. PHP'de satın alma tarihini (şu anki tarih) saklamak ve sonra veritabanında saklamak için kod nedir?
    2. Lütfen her birini nasıl kullanacağınızı, internette bolca açıklama okuduktan sonra nasıl kullanacağınızı açıklayın, yine de tam olarak anlamadım.

Bir süre önce, performansın mutlak bir zorunluluk olduğu büyük bir projem vardı, aylarca süren araştırmalardan sonra varchar alanında depolanan bir UTC zaman damgası kullandık, ihtiyaçlarımız için daha hızlı ve daha iyi olduğumuzu kanıtladı (büyük sosyal ağ)
JasonDavis

Yanıtlar:


29

MySQL zaman damgaları :

  • UTC'de saklanır

    Depolama sırasında UTC'ye dönüştürülürler ve alımda zaman diliminize geri dönüştürülürler. Eğer varsa , saat dilimi ayarlarını değiştirmek , alınan değerler de değişir.

  • Otomatik olarak başlatılabilir ve güncellenebilir

    Varsayılan değerlerini ve / veya otomatik güncelleme değerlerini CURRENT_TIMESTAMP

  • Aralığına sahip 1970-01-01 00:00:01 UTColmak2038-01-19 03:14:07 UTC

MySQL tarihsaat :

  • Sakladığınız şey ne elde edeceğiniz ™.

  • Aralığına sahip 1000-01-01 00:00:00olmak9999-12-31 23:59:59

    Aralığın dışındaki değerler işe yarayabilir - ancak yalnızca aralığın içindeki değerlerin çalışması garanti edilir.

  • Gün veya ayın sıfır olduğu tarihleri ​​saklayabilirsiniz.

    Bu MySQL'in doğum günlerini saklama şeklidir! Bunu a ile yapamazsınız TIMESTAMP, bunun tek istisnası sıfır değeridir 0000-00-00.

  • Gerekirse geçersiz tarihleri ALLOW_INVALID_DATES modunda saklayabilirsiniz .

  • NOW()Bazı durumlarda varsayılan değeri ayarlayabilirsiniz , ancak otomatik olarak başlatılan ve güncellenen tarihlerin tercih edilen ve daha doğal yolu budur TIMESTAMP.

Tabii ki aynı zamanda var DATEve bunlar da aynı şekilde TIMEçalışıyor DATETIME, ama elbette DATEzamanı TIMEumursamıyor ve tarihi umursamıyor. Dört veri türü de, çeşitli tarih ve saat işlevleriyle mükemmel çalışır , ancak veri türlerini karıştırırken dönüştürme etkilerinin farkında olmalısınız .

Şimdi, sorunuza: Her DATETIMEyerde kullanmalısınız . Teknik nedenlerden dolayı değil, fakat MySQL'in nasıl çalıştığı konusunda hala belirsiz DATETIMEolduğunuz için, daha basit bir seçimdir. Bu, PHP'yi kaydetmeden önce mevcut zaman damgasını hesaplamak zorunda kalacağınız anlamına gelir, bu kadar kolay:

$mysqldate = date("Y-m-d H:i:s"); 

PHP'nin tarih işlevi şöyle çalışır:

string date ( string $format [, int $timestamp = time() ] )

"Y-m-d H:i:s"Biçimi MySQL ile ve ikinci parametre boş bırakarak uyumlu biridir date()aramaları time()güncel olsun UNIX zaman damgası .

TIMESTAMPBunun yerine kullanmak DATETIME, geçerli zaman damgasına karar verme sorumluluğunu üstlenen MySQL'in katma değerine sahiptir ve eklerken / güncellerken alanı atlayabilirsiniz. Ancak zaten bir sorgu gönderiyorsanız ve PHP'deki geçerli zaman damgasını almak için gereken kod en az düzeyde olduğundan, DATETIMEher şey için güvenle gidebilirsiniz .

PHP zaman damgasını veritabanında saklamak için gerçek kod olarak, PHP Data Objects'e bakmalı ve hala belirsizseniz, bunun yerine StackOverflow'a sormalısınız . Fakat zaten 1.5k ile ilgili sorular zaten var, sormadan önce bunlara göz attığınızdan emin olun. Sadece bir ipucu, hazırlanmış ifadeler , havalı çocukların nasıl yaptıklarıdır.


Hmm, sorguyu MySQL'e nasıl göndereceğiniz veya tablo yapınızdaki bir problem olabilir ... StackOverflow bu tür problemler için daha iyi bir yer, tablo yapınız ve tam php kodunuzla birlikte bir soru gönderin. Sorunun ne olduğu ve ne denediğiniz konusunda bazı detaylar. Burada uygulama özelliklerini gerçekten tartışmıyoruz ...
yannis

Cevabın için teşekkürler. $ Mysqldate = date kullanmayı denedim ("Ymd H: i: s"); $ query = php kodumdaki VALUE ('". $ mysqldate."') tablosuna INSERT (php kodumda) ancak Date (field) - Datetime (datatype) içinde 0000-00-00 00:00:00 olarak MySQL'de tutulacaktı. Şu anki Tarih ve Saati kaydetmeyi düşünüyorum. Veri türünü veritabanında Zaman Damgası olarak ayarlarsam, php kodlaması nasıl yapılır?
Modüler

Şu anda Stackoverflow hakkında yorum gönderemem. Biraz utanç verici geliyor ama bana böyle yaptılar.
Modüler

Bunun için üzgünüm, ancak geçici olarak askıya alma modundaysanız, bunun iyi bir nedeni olmalı. Şimdi, yorumunuzdaki koddaki olası bir hata, alanı şu şekilde adlandırıyor olmanızdır: Datebu, DATEveri türü için ayrılmış bir kelimedir ve garip şeyler olabilir (MySQL sürümüne bağlı olarak), bu nedenle, bunun gibi bir şeyi yeniden adlandırmayı deneyin creationdateve ne olduğunu görün . Ayrıca, PHP'den TIMESTAMPalanlara aynı alanlara bakmalısınız DATETIME, bunun önemi yok. Biçimleri aynıdır.
yannis

Bir milyon teşekkürler. Neredeyse bütün geceyi nedenini anlamaya çalışarak geçirdikten sonra sıralandı. :)
Modüler

2

Bu makaleden alınan referans:

Ana farklılıklar:

TIMESTAMP, kayıtlardaki değişiklikleri izlemek ve kayıt her değiştirildiği zaman güncellenmek için kullanılır. DATETIME, kayıtlardaki hiçbir değişiklikten etkilenmeyen belirli ve statik bir değeri saklamak için kullanılır.

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

TIMESTAMP dahili olarak depolama için mevcut zaman dilimini UTC'ye ve alım sırasında mevcut zaman dilimine geri dönüştürülür. DATETIME bunu yapamaz.

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


1
Peki, 2040 yılında kayıtlarda değişiklik yapmak için ne kullanırsın, Zaman Damgası? Sanırım hayır.
Bsienn

-1

Buna çok basit bir şekilde bakıyorum. Senin durumunda i hem kullanırsınız datetimeve timestamp. Her ikisini de kullanarak, veri depolamak veya bunun gibi bir şeyle ilgili ek bir sorun yaşamayacaksınız. Tablonuzdaki bir ek alan (sütun) da büyük bir sorun değildir.

Bu yüzden benim açımdan ve şimdiye kadarki deneyimlerime göre her ikisini de kullanıyorum. Ziyaretçinize bir tarih göstermek veya ziyaretçilere anlaşılabilir hale getirmek istediğinizde, tarih / saat biçiminde bir tarih gösterin.

Bir şeyi hesaplamak istediğinizde Datetime formatı bir acı olabilir (2 tarih arasındaki fark, geçerli tarihten dünün tarihini alma, geçerli tarihten 1 hafta önce alma, yarın tarihini alma veya benzeri bir şey.) Gerçekten zor değil ama genellikle Onları dönüştürmek timestampve sonra şeyler yapmak gerekir. Ve evet, örneğin geçerli saatiniz ile olsun: $current = date("Y-m-d");ya $current = date("Y-m-d H:i:s");da saat, dakika ve saniye de isterseniz.

Zaman damgası sadece 11 rakam uzunluğundadır ve bu da gerçekten hiçbir şey "demek" değildir. Ona baktığınızda hangi tarihi temsil ettiğini bilemezsiniz. Bu yüzden kullanıcı dostu değil ve sadece onu yankı yapmak ve ziyaretçilerinize ziyaretçilerinize göstermek için kullanamazsınız. “Okunabilir bir şeye” dönüştürmeniz gerekecek. Ama aynı zamanda kolayca dönüştürmek ve farklı tarihleri ​​hesaplamak için bir yetenek sunar. Örneğin, yarın için aynı anda zaman damgası almak istiyorsanız, geçerli tarihe yalnızca saniye sayısı ekleyin ve yarın zaman damgasına sahip olursunuz. Örnek: $tomorrow = time()+24*3600;Ayrıca saniye cinsinden iki tarih arasında veya bunun gibi bir şeyde kolayca fark alabilirsiniz.

Bu yüzden hem tarih saatini hem de zaman damgasını kullanmanızı öneririm. Örneğin PhpMyadmin kullanıyor olsanız ve bazı verilere hızlıca bakmak istiyorsanız, tarih saat biçiminde bir tarih gördüğünüzde (örnek 2011-12-20 10:15:20:) sadece 11digit numarasına bakarsanız, sizin için daha kolay olacaktır. Yani ikisini de kullanın ve sonra size en uygun olanı arayın ve kullanın.

İsterseniz veya sadece birini seçmek isterseniz, her ikisini de kullanmanız için zaman damgası öneririm.


1
-1 Timestamp is just a number 11 digit long which doesn't really "mean" anythingMySQL zaman damgaları datetime ile aynı biçimde saklanır. Tanımladığınız hesaplamaları yapmak için bunları php zaman damgalarına da dönüştürmeniz gerekir, VEYA sadece MySQL'in birçok tarih / zaman işlevini kullanmanız ve veritabanında hesaplamaları yapmanız gerekir. Cevabınız pek mantıklı değil.
yannis
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.