Zaman damgasını php kullanarak mysql tablosuna kaydetme


95

MySQL tablosunda timestampveri türü olan bir alanım var . Verileri bu tabloya kaydediyorum. Ancak zaman damgasını ( 1299762201428) kayda geçirdiğimde , değeri 0000-00-00 00:00:00o tabloya otomatik olarak kaydeder .

Zaman damgasını bir MySQL tablosunda nasıl saklayabilirim?

İşte INSERTifadem:

INSERT INTO table_name (id,d_id,l_id,connection,s_time,upload_items_count,download_items_count,t_time,status)
VALUES (1,5,9,'2',1299762201428,5,10,20,'1'),
       (2,5,9,'2',1299762201428,5,10,20,'1')

1
Hangi zaman damgasından bahsediyorsun? Nereden aldın?
Ortak Aklınız

1
Tablo yapınızı buraya yapıştırabilir misiniz?

Yanıtlar:


162

böyle geç

date('Y-m-d H:i:s','1299762201428')

7
ancak db gösterilerde olsun değer sütun türüdür datetime, aşağıda belirtilen yerlere değiştirmek istiyorsanız timestampo zaman için sütun türünü değiştirmekvarchar(15)
jimy

2
Ardından bir INT alanına koyun. Her neyse, bir zaman damgası yalnızca bir tarihin temsilidir ve bunun tersi de geçerlidir. Zaman damgasından bugüne jimy'nin size söylediği işlevle ve tam tersi ile dönüşüm yapabilirsiniz strtotime. düzenleme: btw, zaman damgası yalnızca olası tüm tarih aralığını kapsar (1970-01-01'den xx-xx-
2032'ye kadar

4
Öyleyse zaman damgası veri türünün kullanımı nedir? s_time alanında zaman damgası veri türü var. Bu alana 1299762201428 kaydedemez miyim?
gautamlakum

@ lakum4stackof: Zaman damgası veri türü için, ayrıntı için lütfen dev.mysql.com/doc/refman/5.0/en/timestamp.html adresine bakın .
RollingBoy

1
@ lakum4stackof - zaman damgasının kullanımı, zaman damgasını kaydetmenizdir, ancak yalnızca tarih olarak görüntülenir. Dahili olarak (tüm veri türleri gibi) işaretli tamsayı olarak saklanır. Bu zaman damgasını bir tamsayı olarak da biçimlendirmek istiyorsanız, o zaman INT alanını kullanmanızı öneririm. Zaman damgası sütununun kullanımı, tarih manipülasyonudur (aralıklar vb. Ekleme).
Michael JV

52

Merhaba, bunun için FROM_UNIXTIME()işlevi kullanın .

Bunun gibi:

INSERT INTO table_name
(id,d_id,l_id,connection,s_time,upload_items_count,download_items_count,t_time,status)
VALUES
(1,5,9,'2',FROM_UNIXTIME(1299762201428),5,10,20,'1'), 
(2,5,9,'2',FROM_UNIXTIME(1299762201428),5,10,20,'1')

Bu neden daha iyi date('Y-m-d H:i:s','1299762201428')?
Yuri

5
Tür güvenliği: FROM_UNIXTIMEphp'ler date()bir dizge döndürürken yerel bir mysql tarih türü verir .
Richard Tuin

5
Daha iyi çünkü web sunucusu (PHP) ve MySQL farklı yerlerde olabilir. Bu nedenle tarih ('Ymd H: i: s', '1299762201428') web sunucusunun Zaman Dilimini ayarlayacaktır. Farklı bölgelere yerleştirilmiş farklı web sunucuları ile tutarsız verilere sahip olacaksınız. Alternatif olarak, kodunuzda, uygulama saat dilimini MySQL'in saat dilimine zorlamanız gerekir. date_timezone_set
Ostico

18
$created_date = date("Y-m-d H:i:s");
$sql = "INSERT INTO $tbl_name(created_date)VALUES('$created_date')";
$result = mysql_query($sql);

15

Açıklığa kavuşturulması gereken bazı şeyler:

  • MySQL zaman damgası alan türü, unix zaman damgalarını değil, bunun yerine bir tarih saat türü değerini depolar.
  • UNIX zaman damgası, normal int türünün bir sayısıdır.
  • Bahsettiğiniz zaman damgası normal bir unix zaman damgası değil, milisaniyelik bir zaman damgasıdır.

bu nedenle doğru cevap olurdu

$timestamp = '1299762201428';
$date = date('Y-m-d H:i:s', substr($timestamp, 0, -3));

3

Veri türü " işaretsiz bigint " bu gereksinimi karşılayabilir.


3

now()Sorgunuzda da kullanabilirsiniz , yani:

insert into table (time) values(now());

Mevcut zaman damgasını kullanacaktır.


2

Değeri kaydetmeye çalıştığınız alanın tarih saat alanı olduğunu tahmin ediyorum, ancak aynı şey zaman damgaları için de geçerli görünüyor . Eğer öyleyse, mysql biçimin Yıl-ay-gün Saat: dakika: saniye olmasını bekler. Zaman damgasını kaydetmek için, aşağıdaki gibi bir sorgu kullanarak alanı sayısal hale getirmeniz gerekir.

alter table <table_name> change <field> <field> bigint unsigned

Şu anki saati kullanıyorsanız, şimdi () veya current_timestamp kullanabilirsiniz.


1

Kullanın FROM_UNIXTIME().

Not: 1299762201428 daha çok bir milisaniye zaman damgasına benziyor (JavaScript'te Date () * 1 gibi) ve muhtemelen bunu 1000'e bölmeniz gerekiyor.


1

Tablodaki alan türünü kontrol edin, sadece veri türündeki zaman damgası değerini kaydedin bigint.

datetimeTip değil



0

Zaman damgası geçerli saatse, mysql NOW()işlevini kullanabilirsiniz.


0

datetimeAlan türünü kullanın . İnsan tarafından okunabilirlik (kimse zaman damgası okumaz) ve MySQL işlevleri gibi birçok avantajla birlikte gelir .

Unix zaman damgasından dönüştürmek için MySQL işlevini kullanabilirsiniz FROM_UNIXTIME(1299762201428). Geri dönüştürmek için kullanabilirsiniz UNIX_TIMESTAMP: SELECT UNIX_TIMESTAMP(t_time) FROM table_name.

Elbette, MySQL işlevini beğenmezseniz, her zaman PHP: kullanabilirsiniz 'INSERT INTO table_name SET t_time = ' . date('Y-m-d H:i:s', $unix_timestamp).


timestamp Alan türü (kullanırken çok okunabilir insandır SELECTkonsolunda). Çok farklılar ve her ikisinin de dezavantajları var. Temel fark, saat dilimlerinin nasıl ele alındığıdır.
Udo G

@Udo G: Haklısınız, ancak yine datetimede çeşitli nedenlerden dolayı tercih ediyorum . Size göre en büyük dezavantaj / avantaj nedir?
Znarkus

en büyük avantajı timestamp: hem sunucunun hem de istemcinin saat dilimi ayarlarına bağışık olduğu için PHP zaman damgalarıyla daha iyi eşleşirken, MySQL istemcinizin saat dilimine bağlı olarak görüntülenen değeri datetimedeğiştirir (tabii ki projenize bağlıdır, biri daha iyi). en büyük dezavantajı : NULL değerlerini desteklemiyor ve (bunu programladıklarında ne içtiklerini bilmiyorum) bir alan a olur . Benim durumumda maalesef TZ nedenleriyle kullanmam gerekiyor . timestampTIMESTAMP NOT NULLTIMESTAMP NULL DEFAULT CURRENT_TIMESTAMPTIMESTAMP
Udo G

0

Veri türünü kullanmak daha iyidir varchar(15).


3
Bir sayıyı dizge biçiminde kaydetmek genellikle iyi bir uygulama değildir, çünkü dizeler karşılaştırıldığında daha yavaştır ve hesaplama yapmak daha zordur.
RollingBoy

Benim oyum imzasız int'e gidiyor - ama hadi tavşan deliğine gidelim. Neden char değil varchar? Sabit uzunlukta bir giriş - mikro optimizasyon, ama yine de ...
BradChesney79


-1

Veritabanının MySQL olduğunu biliyorsam, NOW () işlevini şu şekilde kullanacağım:

INSERT INTO table_name
   (id, name, created_at) 
VALUES 
   (1, 'Gordon', NOW()) 

Bu, yalnızca OP'nin istediği şeyi değil, yalnızca geçerli zaman damgasını saklayacaktır.
charliefortune
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.