Menyimpan stempel waktu di tabel mysql menggunakan php

94

Saya memiliki kolom di tabel MySQL yang memiliki timestamptipe data. Saya menyimpan data ke dalam tabel itu. Tetapi ketika saya meneruskan timestamp ( 1299762201428) ke record, secara otomatis menyimpan nilai 0000-00-00 00:00:00ke dalam tabel itu.

Bagaimana cara menyimpan stempel waktu di tabel MySQL?

Ini INSERTpernyataan saya :

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')
gautamlakum
sumber
1
Stempel waktu apa yang Anda bicarakan? Dimana kamu mendapatkannya
Akal Sehat Anda
1
dapatkah kamu menempelkan struktur tabelmu di sini?

Jawaban:

160

lulus seperti ini

date('Y-m-d H:i:s','1299762201428')
jimy
sumber
7
tetapi nilai yang anda dapatkan dalam db menunjukkan tipe kolomnya adalah datetime, jika anda ingin mengubahnya timestampmaka ganti jenis kolomnya menjadivarchar(15)
jimy
2
Kemudian letakkan di bidang INT. Bagaimanapun, stempel waktu hanyalah representasi dari tanggal, dan sebaliknya. Anda dapat mengonversi dari stempel waktu ke tanggal dengan fungsi yang dikatakan jimy kepada Anda, dan sebaliknya dengan strtotime. sunting: btw, cap waktu hanya mencakup rentang dari semua kemungkinan tanggal (1970-01-01 hingga xx-xx-2032 menurut saya)
Carlos Campderrós
4
jadi apa gunanya datatype timestamp? Bidang s_time memiliki tipe data stempel waktu. Tidak dapatkah saya menyimpan 1299762201428 ke bidang itu?
gautamlakum
@ lakum4stackof: Untuk tipe data stempel waktu, lihat dev.mysql.com/doc/refman/5.0/en/timestamp.html untuk detailnya.
RollingBoy
1
@ lakum4stackof - penggunaan stempel waktu adalah Anda menyimpan stempel waktu, tetapi hanya ditampilkan sebagai tanggal. Secara internal (karena semua tipe data) disimpan sebagai integer bertanda tangan. Jika Anda juga ingin memformat stempel waktu itu sebagai integer, saya sarankan Anda menggunakan bidang INT saja. Penggunaan kolom timestamp adalah manipulasi tanggal (menambahkan interval dan semacamnya).
Michael JV
52

Halo, gunakan FROM_UNIXTIME()fungsi untuk ini.

Seperti ini:

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')
Richard Tuin
sumber
Mengapa ini lebih baik dari date('Y-m-d H:i:s','1299762201428')?
Yuri
5
Jenis keamanan: FROM_UNIXTIMEmenghasilkan tipe tanggal mysql asli sementara php date()mengembalikan string.
Richard Tuin
5
Lebih baik karena server web (PHP) dan MySQL bisa berada di tempat yang berbeda. Jadi, tanggal ('Ymd H: i: s', '1299762201428') akan menyetel TimeZone server web. Dengan server web berbeda yang ditempatkan di zona berbeda, Anda akan memiliki data yang tidak konsisten. Atau, dalam kode Anda, Anda harus memaksa zona waktu aplikasi ke zona waktu MySQL. 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);
Tushar Kumar Kundan
sumber
15

Beberapa hal yang perlu diperjelas:

  • Jenis kolom stempel waktu MySQL tidak menyimpan stempel waktu unix melainkan nilai jenis waktu.
  • Stempel waktu UNIX adalah sejumlah tipe int biasa.
  • Stempel waktu yang Anda bicarakan bukanlah stempel waktu unix biasa, tetapi stempel waktu dengan milidetik.

oleh karena itu jawaban yang benar adalah

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

Jenis data ' bigint unsigned ' mungkin sesuai dengan persyaratan ini.

RollingBoy
sumber
2

Saya menduga bahwa bidang yang Anda coba simpan nilainya adalah bidang waktu dan waktu itu tidak tetapi tampaknya sama berlaku untuk stempel waktu . Jika demikian mysql mengharapkan formatnya menjadi Tahun-bulan-hari Jam: menit: detik. Untuk menyimpan stempel waktu Anda harus mengubah bidang menjadi numerik menggunakan kueri seperti

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

Jika Anda menggunakan waktu saat ini, Anda dapat menggunakan now () atau current_timestamp.

Belinda
sumber
2

Anda juga dapat menggunakan now()kueri Anda, yaitu:

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

Ini akan menggunakan stempel waktu saat ini.

Masood Moshref
sumber
1

Gunakan FROM_UNIXTIME().

Catatan: 1299762201428 lebih terlihat seperti stempel waktu milidetik (seperti Date () * 1 di JavaScript), dan Anda mungkin harus membaginya dengan 1000.

Udo G
sumber
1

Periksa jenis bidang dalam tabel, cukup simpan nilai cap waktu dalam jenis data seperti bigintdll.

Bukan datetimetipe


sumber
1

Ini harus melakukannya:

  $time = new DateTime; 
misaizdaleka
sumber
0

Jika stempel waktu adalah waktu saat ini, Anda dapat menggunakan NOW()fungsi mysql

ipsum
sumber
0

Gunakan datetimetipe bidang. Muncul dengan banyak keuntungan seperti keterbacaan manusia (tidak ada yang membaca cap waktu) dan fungsi MySQL .

Untuk mengonversi dari stempel waktu unix, Anda dapat menggunakan fungsi MySQL FROM_UNIXTIME(1299762201428). Untuk mengkonversi kembali Anda dapat menggunakan UNIX_TIMESTAMP: SELECT UNIX_TIMESTAMP(t_time) FROM table_name.

Tentu saja, jika Anda tidak menyukai fungsi MySQL, Anda bisa selalu menggunakan PHP: 'INSERT INTO table_name SET t_time = ' . date('Y-m-d H:i:s', $unix_timestamp).

Znarkus
sumber
The timestamp jenis lapangan adalah dibaca manusia juga (bila menggunakan SELECTdi konsol). Mereka sangat berbeda dan keduanya memiliki kekurangan / kelebihan. Perbedaan utamanya adalah bagaimana zona waktu ditangani.
Udo G
@Udo G: Anda benar, tetapi saya masih lebih suka datetimekarena berbagai alasan. Apa kerugian / keuntungan terbesar menurut Anda?
Znarkus
keuntungan terbesar untuk timestamp: lebih cocok dengan cap waktu PHP karena kebal terhadap pengaturan zona waktu server dan klien, sedangkan datetimeperubahan nilai yang ditampilkan tergantung pada zona waktu klien MySQL Anda (tentu saja itu tergantung pada proyek Anda, yang mana satu lebih baik). kerugian terbesar untuk timestamp: tidak mendukung nilai NULL dan (saya tidak tahu apa yang mereka merokok ketika mereka memprogram ini) sebuah TIMESTAMP NOT NULLfield menjadi a TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP. Dalam kasus saya, sayangnya saya perlu menggunakan TIMESTAMPkarena alasan TZ.
Udo G
0

Lebih baik menggunakan tipe data varchar(15).

gautamlakum
sumber
3
Menyimpan angka dalam bentuk string biasanya bukan praktik yang baik, karena string lebih lambat dibandingkan dan lebih sulit untuk melakukan kalkulasi.
RollingBoy
Pilihan saya adalah unsigned int-- tapi mari kita pergi ke lubang kelinci. Mengapa varchar dan bukan char? Ini adalah entri dengan panjang tetap-- pengoptimalan mikro, tetapi masih ...
BradChesney79
0

Anda dapat melakukan: $date = \gmdate(\DATE_ISO8601);.

HelpNeeder
sumber
-1

Jika saya tahu database-nya adalah MySQL, saya akan menggunakan fungsi NOW () seperti ini:

INSERT INTO table_name
   (id, name, created_at) 
VALUES 
   (1, 'Gordon', NOW()) 
Jannie Theunissen
sumber
Ini hanya akan menyimpan stempel waktu saat ini, tidak sepenuhnya yang diminta OP.
charliefortune