Zapisywanie znacznika czasu w tabeli mysql przy użyciu php


94

Mam pole w tabeli MySQL, które ma timestamptyp danych. Zapisuję dane w tej tabeli. Ale kiedy przekażę znacznik czasu ( 1299762201428) do rekordu, automatycznie zapisuje wartość 0000-00-00 00:00:00w tej tabeli.

Jak mogę przechowywać znacznik czasu w tabeli MySQL?

Oto moje INSERToświadczenie:

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
O jakiej sygnaturze czasowej mówisz? Skąd to masz?
Your Common Sense

1
czy możesz wkleić tutaj strukturę swojej tabeli?

Odpowiedzi:


160

przejść w ten sposób

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

7
ale wartość datetimetimestampvarchar(15)
uzyskana

2
Następnie umieść go na polu INT. W każdym razie znacznik czasu jest tylko reprezentacją daty i odwrotnie. Możesz przekonwertować datownik na datę za pomocą funkcji, o której powiedział jimy, i na odwrót za pomocą strtotime. edit: btw, timestamp obejmuje tylko zakres wszystkich możliwych dat (myślę, że od 1970-01-01 do xx-xx-2032)
Carlos Campderrós

4
więc jakie jest zastosowanie typu danych sygnatury czasowej? Pole s_time ma typ danych datownika. Nie mogę zapisać 1299762201428 w tym polu?
gautamlakum

@ lakum4stackof: Aby uzyskać szczegółowe informacje, zobacz dev.mysql.com/doc/refman/5.0/en/timestamp.html, aby uzyskać informacje o typie datownika .
RollingBoy,

1
@ lakum4stackof - użycie timestamp polega na tym, że zapisujesz znacznik czasu, ale jest on wyświetlany tylko jako data. Wewnętrznie (jak wszystkie typy danych) jest przechowywany jako liczba całkowita ze znakiem. Jeśli chcesz również sformatować ten znacznik czasu jako liczbę całkowitą, sugeruję, abyś użył wtedy pola INT. Użycie kolumny timestamp to manpipulacja daty (dodawanie interwałów i tym podobne).
Michael JV

52

Hej, użyj FROM_UNIXTIME()do tego funkcji.

Lubię to:

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')

Dlaczego to jest lepsze niż date('Y-m-d H:i:s','1299762201428')?
Jurij

5
Bezpieczeństwo typów: FROM_UNIXTIMEzwraca natywny typ daty mysql, podczas gdy php date()zwraca ciąg.
Richard Tuin

5
Jest lepiej, ponieważ serwer WWW (PHP) i MySQL mogą znajdować się w różnych miejscach. Tak więc data („Ymd H: i: s”, „1299762201428”) ustawi strefę czasową serwera WWW. Z różnymi serwerami internetowymi umieszczonymi w różnych strefach będziesz mieć niespójne dane. Alternatywnie, w swoim kodzie musisz wymusić strefę czasową aplikacji na strefę czasową 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);

15

Kilka rzeczy do wyjaśnienia:

  • Typ pola datownika MySQL nie przechowuje uniksowych znaczników czasu, ale raczej wartość typu datetime.
  • Znacznik czasu UNIX to liczba zwykłego typu int.
  • Znacznik czasu, o którym mówisz, nie jest zwykłym znacznikiem czasu uniksowego, ale znacznikiem czasu z milisekundami.

Dlatego poprawna odpowiedź byłaby

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


2

Domyślam się, że pole, w którym próbujesz zapisać wartość, jest polem daty i godziny . To nie jest, ale to samo wydaje się być prawdą w przypadku znaczników czasu . Jeśli tak, mysql oczekuje, że format będzie następujący: rok-miesiąc-dzień Godzina: minuta: sekunda. Aby zapisać znacznik czasu, będziesz musiał przekonwertować pole na numeryczne za pomocą zapytania takiego jak

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

Jeśli używasz aktualnego czasu, możesz użyć now () lub current_timestamp.


2

Możesz również użyć now()w swoim zapytaniu, tj .:

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

Wykorzysta aktualny znacznik czasu.


1

Posługiwać się FROM_UNIXTIME() .

Uwaga: 1299762201428 wygląda bardziej jak milisekundowy znacznik czasu (jak Date () * 1 w JavaScript) i prawdopodobnie musisz podzielić to przez 1000.


1

Sprawdź typ pola w tabeli, po prostu zapisz wartość znacznika czasu w typie danych, takim jak bigint itp.

Nie datetimewpisz



0

Jeśli znacznik czasu to aktualny czas, możesz użyć NOW()funkcji mysql


0

Użyj datetimetypu pola. Ma wiele zalet, takich jak czytelność dla człowieka (nikt nie czyta znaczników czasu) i funkcje MySQL .

Aby przekonwertować z uniksowego znacznika czasu, możesz użyć funkcji MySQL FROM_UNIXTIME(1299762201428). Aby przekonwertować z powrotem można użyć UNIX_TIMESTAMP: SELECT UNIX_TIMESTAMP(t_time) FROM table_name.

Oczywiście, jeśli nie podoba funkcji MySQL, zawsze można użyć PHP: 'INSERT INTO table_name SET t_time = ' . date('Y-m-d H:i:s', $unix_timestamp).


Typ timestamp pola jest również czytelny dla człowieka (podczas używania SELECTw konsoli). Są bardzo różne i obie mają swoje wady / zalety. Główna różnica polega na tym, jak obsługiwane są strefy czasowe.
Udo G

@Udo G: Masz rację, ale nadal wolę datetimez różnych powodów. Jaka jest według Ciebie największa wada / zaleta?
Znarkus,

największa zaleta timestamp: lepiej dopasowuje się do znaczników czasu PHP, ponieważ jest odporny na ustawienia strefy czasowej zarówno serwera, jak i klienta, natomiast datetimezmienia wyświetlaną wartość w zależności od strefy czasowej klienta MySQL (oczywiście zależy to od projektu, który jeden jest lepszy). największa wada timestamp: nie obsługuje wartości NULL i (nie wiem, co zrobili, kiedy to zaprogramowali) TIMESTAMP NOT NULLpole staje się TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP. W moim przypadku niestety muszę użyć TIMESTAMPze względów TZ.
Udo G

0

Lepiej jest użyć typu danych varchar(15).


3
Zapisywanie liczby w postaci ciągu zwykle nie jest dobrą praktyką, ponieważ łańcuchy są wolniejsze w porównaniu i trudniejsze do wykonania obliczeń.
RollingBoy,

Mój głos trafia do unsigned int - ale przejdźmy do króliczej nory. Dlaczego varchar, a nie char? Jest to wpis o stałej długości - mikro-optymalizacja, ale nadal ...
BradChesney79,


-1

Jeśli wiem, że bazą danych jest MySQL, użyję funkcji NOW () w następujący sposób:

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

To zapisze tylko aktualny znacznik czasu, a nie dokładnie to, o co prosi OP.
charliefortune
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.