Проблем с timestam при MySQL

8 отговора 923 прегледа
#1

Проблем с timestam при MySQL

Значи, на хостинг'а дето си хоствам сайта имам следния проблем.
Немога да задам за тип на таблица timestam (8) . Ползвам за администрация PhpMyAdmin. Каквито и атрибути да му задам то винаги си го сетва само на timestam с default 0000-00-00 00:00, и записите вътре са във вид например: 2005-02-21 18:47:25
Аз пък искам типът на колоната да е фиксирано timestam (8) и да се запази във формат например: 20050221.
На моят си компютър нямам проблеми и всичко си е ОК. само на хостинг'а е.
Та, ако някой може да ми помогне ще съм му много благодарен.
Версията на MySQL'a e 4.18

Отговор
в отговор на Явop #2

Re: Проблем с timestam при MySQL

Версията съвсем очевидно НЕ Е 4.18 а е 4.1.8

TIMESTAMP се запазва винаги по един и същи начин - като 4 байта.

Във версия 4.0 по подразбиране се представя като YYYYMMDDhhiiss което противоречи на ANSI SQL стандарта и затова в 4.1 е YYYY-MM-DD hh:ii:ss

[линк]
#

Warning: Incompatible change! TIMESTAMP is now returned as a string of type 'YYYY-MM-DD HH:MM:SS' and different timestamp lengths are not supported.

This change was necessary for SQL standards compliance. In a future version, a further change will be made (backward compatible with this change), allowing the timestamp length to indicate the desired number of digits of fractions of a second.

salle.online.bg/sig
Отговор
в отговор на salle #3

Re: Проблем с timestam при MySQL

Блягодаря ти за отговора,
да версията е 4.1.8
то излиза, че TIMESTAMP е същото като DATETIME.
ползвах TIMESTAMP за проверка на деня т.е например за днеска:
В отговор на:


$today = date("Ymd");
$query = mysql_query("select* form table where today='$today'");



където today e TIMESTAMP (8)

ще имам ли някакви проблеми ако ползвам LIKE , например
В отговор на:


$today = date("Y-m-d");
$query = mysql_query("select* form table where today LIKE \"%$today%\"'");



където today вече ще е DITETIME

Отговор
в отговор на Явop #4

Сом таймс шит хепънс ...

В отговор на:

$today = date("Ymd");
$query = mysql_query("select* form table where today='$today'");




а защо не
$query = mysql_query("select * form table where DATE_FORMAT('%Y%m%d', NOW())=today");

root@ro6avia#echo rm -rf * > /bin/seek_and_destroy
root@ro6avia#/bin/seek_and_destroy
Отговор
в отговор на ro6avia #5

Re: Сом таймс шит хепънс ...

Рошав, твоята заявка, колкото и да е хубава е бавна. Мускл няма да може да ползва никакъв индекс. Неговата е по-добра, защото тогава БД може да се пробва с индекс, ако има подходящ. За съжаление в подобни ситуации може да изникне проблем, ако часовниците на ДБ-то и ПХП-то са разсинхронизирани. Но в общият случай никой не гони супер висока точност :)

Отговор
в отговор на Aндpeй #6

Re: Не си прав .. а и аз не съм :)

Заявката на Рошавия може да използва индекс, но пък се съмнявам, че ще върне коректен резултат пре положение, че колонката е TIMESTAMP

salle.online.bg/sig
Отговор
в отговор на salle #7

Re: Не си прав .. а и аз не съм :)

На MySQL 3.23.56-nt резултата е чудесен и съвсем точен ;-)

root@ro6avia#echo rm -rf * > /bin/seek_and_destroy
root@ro6avia#/bin/seek_and_destroy
Отговор
в отговор на salle #8

Re: Не си прав .. а и аз не съм :)

Значи аз направих една табличка в тиместамп(8), обаче нещо резултатите не са коректни :
mysql> select version();
+------------+
| version() |
+------------+
| 4.1.10-log |
+------------+

mysql> create table t21(txt varchar(20), today timestamp(8));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t21 values ("vchera", now() - interval 24 hour), ("dnes", now()), ("utre", now() + interval 12 hour), ("vdrugiden", now() + interval 38 hour);
Query OK, 4 rows affected (0.04 sec)

mysql> select * from t21 where DATE_FORMAT('%Y%m%d', NOW())=today;
Empty set, 5 warnings (0.02 sec)

mysql> show warnings;
+---------+------+-----------------------------------------------------+
| Level | Code | Message |
+---------+------+-----------------------------------------------------+
| Warning | 1292 | Truncated incorrect datetime value: '%%-1119884188' |
| Warning | 1292 | Truncated incorrect datetime value: '%%-1119883132' |
| Warning | 1292 | Truncated incorrect datetime value: '%%-1119883132' |
| Warning | 1292 | Truncated incorrect datetime value: '%%-1119883132' |
| Warning | 1292 | Truncated incorrect datetime value: '%%-1119883132' |
+---------+------+-----------------------------------------------------+
5 rows in set (0.00 sec)

И си прав, че се ползва индекс, миналият път експлеин май ме е излъгал.

Отговор
в отговор на Aндpeй #9

Не знам аз бих действал

по следния начин.
От приложението ще си генерирам стрингове по мой вкус и ще питам
select * from t21 where today=20050303
например.
Така де ако наистина timestamp е във формат yyyymmdd
Или ще си форматирам каквото ми трябва по начина който го показва някой от ДБ мениджърите.

Уф незнам дали ще ти свърши работа, знам само че заради една бележка на salle, един куп думи ги написах на български а не на българоанглийски :)

Bеer? Mоre?
Плацебото
Отговор