PHPを使用してタイムスタンプをMySQLテーブルに保存する


94

MySQLテーブルにtimestampデータ型のフィールドがあります。そのテーブルにデータを保存しています。しかし、タイムスタンプ(1299762201428)をレコードに渡すと、値0000-00-00 00:00:00がそのテーブルに自動的に保存されます。

MySQLテーブルにタイムスタンプを保存するにはどうすればよいですか?

ここに私のINSERT声明があります:

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
あなたが話しているタイムスタンプですか?どこで手に入れたの?
常識

1
ここにテーブル構造を貼り付けることができますか?

回答:


160

このように渡します

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

7
しかし、dbで取得した値は、列タイプがdatetimeであることを示しています。これを変更したい場合は、timestamp列タイプをvarchar(15)
jimy

2
次に、INTフィールドに配置します。とにかく、タイムスタンプは日付の表現にすぎず、その逆も同様です。jimyが教えてくれた関数を使ってタイムスタンプから日付に変換できますstrtotime。編集:ところで、タイムスタンプはすべての可能な日付の範囲のみをカバーします(1970-01-01からxx-xx-2032だと思います)
CarlosCampderrós

4
では、タイムスタンプデータ型の使用は何ですか?s_timeフィールドにはタイムスタンプデータ型があります。1299762201428をそのフィールドに保存できませんか?
gautamlakum

@ lakum4stackof:タイムスタンプデータタイプの詳細については、dev.mysql.com / doc / refman / 5.0 / en / timestamp.htmlを参照してください。
RollingBoy

1
@ lakum4stackof-タイムスタンプを使用すると、タイムスタンプを保存できますが、日付としてのみ表示されます。内部的には(すべてのデータ型として)符号付き整数として格納されます。そのタイムスタンプも整数としてフォーマットしたい場合は、INTフィールドを使用することをお勧めします。タイムスタンプ列の使用は、日付の操作(間隔の追加など)です。
マイケルJV

51

こんにちはFROM_UNIXTIME()、このための関数を使用してください。

このような:

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

なぜこれよりも優れているのdate('Y-m-d H:i:s','1299762201428')ですか?
ユーリ

5
型安全性:FROM_UNIXTIMEPHP date()が文字列を返す間、ネイティブのmysql日付型を生成します。
Richard Tuin '20年

5
Webサーバー(PHP)とMySQLが別の場所にある可能性があるため、より良い方法です。したがって、date( 'Ymd H:i:s'、 '1299762201428')はWebサーバーのTimeZoneを設定します。異なるWebサーバーが異なるゾーンに配置されていると、データに一貫性がなくなります。または、コードで、アプリケーションのタイムゾーンをMySQLのタイムゾーンに強制する必要があります。date_timezone_set
Ostico


15

明確にするべきいくつかの事柄:

  • MySQLタイムスタンプフィールドタイプは、UNIXタイムスタンプではなく、日時のような値を格納します。
  • UNIXタイムスタンプは、通常のint型の数です。
  • あなたが話しているタイムスタンプは、通常のUNIXタイムスタンプではなく、ミリ秒のタイムスタンプです。

したがって、正しい答えは

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


2

あなたが値を保存しようとしているフィールドはそれではない日時フィールドである私は推測していますが、同じことがタイムスタンプにも当てはまるようです。その場合、mysqlはフォーマットが年月日時:分:秒であると想定します。タイムスタンプを保存するには、次のようなクエリを使用してフィールドを数値に変換する必要があります

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

現在の時刻を使用している場合は、now()またはcurrent_timestampを使用できます。



1

使用する FROM_UNIXTIME()ます。

注:1299762201428はミリ秒のタイムスタンプ(JavaScriptのDate()* 1など)に似ており、おそらく1000で除算する必要があります。


1

テーブルのフィールドタイプをチェックして、タイムスタンプ値をデータタイプなどに保存するだけです bigint

ないdatetimeタイプ



0

タイムスタンプが現在の時刻である場合、mysql NOW()関数を使用できます


0

datetimeフィールドタイプを使用します。人間の可読性(誰もタイムスタンプを読み取らない)やMySQL関数など、多くの利点があります

UNIXタイムスタンプから変換するには、MySQL関数を使用できますFROM_UNIXTIME(1299762201428)。バックに変換するには、使用することができますUNIX_TIMESTAMPSELECT UNIX_TIMESTAMP(t_time) FROM table_name

もちろん、MySQL関数が気に入らない場合は、常にPHPを使用できます'INSERT INTO table_name SET t_time = ' . date('Y-m-d H:i:s', $unix_timestamp)


timestamp フィールドタイプは、(使用しているとき、あまりにも読める人間であるSELECTコンソールで)。それらは非常に異なっており、どちらにも欠点があります。主な違いは、タイムゾーンの処理方法です。
Udo G

@ウドG:あなたは正しいですが、私はまだdatetime様々な理由で好みます。あなたの意見の最大の欠点は何ですか?
Znarkus

最大の利点timestamp:サーバーとクライアントの両方のタイムゾーン設定の影響を受けないため、PHPタイムスタンプとのマッチングが向上しますが、MySQLクライアントのタイムゾーンに応じて表示datetimeが変更されます(もちろん、プロジェクトによって異なります)。 1つはより良いです)。最大の欠点timestamp:NULL値をサポートしておらず、(これをプログラムしたときに何を喫煙したのかわかりません)TIMESTAMP NOT NULLフィールドがになりますTIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP。私の場合、残念ながらTZの理由で使用する必要がありますTIMESTAMP
Udo G

0

データ型を使用することをお勧めしvarchar(15)ます。


3
数値を文字列の形式で保存することは、通常、文字列は計算に時間がかかり、計算が難しくなるため、適切ではありません。
RollingBoy

私の投票はunsigned intに行きますが、うさぎの穴に行きましょう。なぜcharではなくvarcharですか?これは固定長エントリです
BradChesney79


-1

データベースがMySQLであることがわかっている場合は、次のようにNOW()関数を使用します。

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

これは、OPが厳密に何を要求しているかではなく、現在のタイムスタンプのみを保存します。
charliefortune 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.