БлогNot. PHP: хранить ли дату как дату :)

PHP: хранить ли дату как дату :)

Казалось бы, самый естественный путь для работы с датой и временем на PHP/MySQL - сохранять в базе данных MySQL значение типа "дата и время" - для этого есть тип столбца datetime:

CREATE DATABASE IF NOT EXISTS datetime;
USE datetime;
DROP TABLE IF EXISTS datetime;
CREATE TABLE datetime (
 date datetime
);
INSERT INTO datetime (date) VALUES ( '2011-06-02 18:00:00' );
INSERT INTO datetime (date) VALUES ( '2011-05-03 17:00:00' );

По умолчанию даты хранятся в MySQL в формате год-месяц-день, за это отвечают установки

date_format %Y-%m-%d
datetime_format %Y-%m-%d %H:%i:%s

В типовой ситуации мы хотим выбрать некие записи и вывести их по убыванию (реже возрастанию) даты:

<?php
  $d=mysql_connect('localhost', 'root', 'root')  or die ("Соединение не установлено!");    
  mysql_select_db('datetime',$d);
  $r=mysql_query('select * from datetime order by date desc') or die ("Ошибка запроса!");
  while ($date = mysql_fetch_array($r)) {
   echo '<p>'.$date['date'].'</p>';
  }
?>

Здесь напечатается:

2011-06-02 18:00:00
2011-05-03 17:00:00

То есть, всё верно, но отображение даты неудобно. Можно его преобразовывать функциями PHP date и strtotime перед выводом:

<?php
  $d=mysql_connect('localhost', 'root', 'root')  or die ("Соединение не установлено!");    
  mysql_select_db('datetime',$d);
  $r=mysql_query('select * from datetime order by date desc') or die ("Ошибка запроса!");
  while ($date = mysql_fetch_array($r)) {
   echo '<p>'.date("d.m.Y, H:i",strtotime($date['date'])).'</p>';
  }
?>

Получилось вот что:

02.06.2011, 18:00
03.05.2011, 17:00

- формат даты/времени привычный и сортировка правильная.

Ещё один путь - использовать встроенную прямо в MySQL функцию date_format:

<?php
  $d=mysql_connect('localhost', 'root', 'root') or die ("Соединение не установлено!");
  mysql_select_db('datetime',$d);
  $r=mysql_query('select *,date_format(date,"%Y.%m.%d, %H:%i") as date1 from datetime order by date1 desc') 
   or die ("Ошибка запроса!");
  while ($date = mysql_fetch_array($r)) {
   echo '<p>'.$date['date1'].'</p>';
  }
?>

Этот тест вывел

2011-06-02 18:00:00
2011-05-03 17:00:00

то есть, опять мы получили "день-месяц-год", а замена формата на date_format(date,"%d.%m.%Y, %H:%i"), очевидно, приведёт к неправильной сортировке - 3 мая окажется позже (выше в списке), чем 2 июня!

Чтобы не решать все эти проблемы с форматами, я просто всегда храню дату как длинное целое:

 Окончание статьи - на сайте

02.06.2011, 22:31 [12530 просмотров]


теги: php mysql дата время

К этой статье пока нет комментариев, Ваш будет первым