Konwertuj znacznik czasu na datę w zapytaniu MySQL

188

Chcę przekonwertować timestampw MySQL na datę.

Chciałbym sformatować pole user.registration w pliku tekstowym jako yyyy-mm-dd.

Oto mój SQL:

$sql = requestSQL("SELECT user.email, 
                   info.name, 
                   FROM_UNIXTIME(user.registration),
                   info.news
                   FROM user, info 
                   WHERE user.id = info.id ", "export members");

Próbowałem także konwersji daty z:

DATE_FORMAT(user.registration, '%d/%m/%Y')
DATE(user.registration)

Powtarzam wynik przed zapisaniem pliku tekstowego i otrzymuję:

email1; name1; DATE_FORMAT (rejestracja użytkownika, '% d /% m /% Y'); aktualności1

email2; name2; news2

Jak mogę przekonwertować to pole do tej pory?

remyremy
źródło
Zapisuje plik dokładnie tak? Jakiego kodu używasz do uruchomienia zapytania SQL?
seanbreeden
1
Zredagowałem moje pytanie, requeteSQL uruchamia zapytanie
remyremy

Odpowiedzi:

373
DATE_FORMAT(FROM_UNIXTIME(`user.registration`), '%e %b %Y') AS 'date_formatted'
Yatin
źródło
2
Począwszy od MySQL 5.6.23, uważam, że wartość FROM_UNIXTIME () powinna być wprowadzana bezpośrednio: tj. DATE_FORMAT (FROM_UNIXTIME (user.registration), '% e% b% Y') AS 'date_formatted'
JESii
WYBIERZ * OD UŻYTKOWNIKÓW GDZIE DATA_FORMAT (FROM_UNIXTIME ( users. user_created_at), „% Y-% b-% e”) = „2015-03-06” to poprawny format, czy powinienem go zmodyfikować?
Dheeraj Thedijje
2
@DheerajThedijje pokazuje się jako 2018-lis-6. Być może szukasz tego '%Y-%m-%d', co sformatujesz w PHP (date('Y-m-d',$row->user_created_at))- to (oba warianty, SQL i PHP) pokazuje się jako 2018-11-06
Chris S.
Jeśli chcesz dodać czas w ten sposób „gg: mm: ss”, dodaj go do ciągu formatu „% H:% i:% s”
luis.ap.uyen
64

Konwertuj znacznik czasu na datę w MYSQL

Stwórz tabelę z całkowitym znacznikiem czasu:

mysql> create table foo(id INT, mytimestamp INT(11));
Query OK, 0 rows affected (0.02 sec)

Wstaw niektóre wartości

mysql> insert into foo values(1, 1381262848);
Query OK, 1 row affected (0.01 sec)

Spójrz

mysql> select * from foo;
+------+-------------+
| id   | mytimestamp |
+------+-------------+
|    1 |  1381262848 |
+------+-------------+
1 row in set (0.00 sec)

Konwertuj liczbę na znacznik czasu:

mysql> select id, from_unixtime(mytimestamp) from foo;
+------+----------------------------+
| id   | from_unixtime(mytimestamp) |
+------+----------------------------+
|    1 | 2013-10-08 16:07:28        |
+------+----------------------------+
1 row in set (0.00 sec)

Konwertuj go na czytelny format:

mysql> select id, from_unixtime(mytimestamp, '%Y %D %M %H:%i:%s') from foo;
+------+-------------------------------------------------+
| id   | from_unixtime(mytimestamp, '%Y %D %M %H:%i:%s') |
+------+-------------------------------------------------+
|    1 | 2013 8th October 04:07:28                       |
+------+-------------------------------------------------+
1 row in set (0.00 sec)
Eric Leschinski
źródło
napraw% h do% H
Tomot
61

Aby dostać datę, możesz castto zrobić

cast(user.registration as date)

i uzyskać określony format date_format

date_format(registration, '%Y-%m-%d')

Demo SQLFiddle

juergen d
źródło
Daje ten sam wynik, zamiast wartości pola wyświetlana jest obsada (user.registration as date)
remyremy
5
To zadziałało - obsada (od_unixtime (user.registration) AS date)
Eric Ness
Mam określony format daty, który mi zadziałał, a także możliwe dzięki
Saber Tabatabaee Yazdi
użyj „jako DATETIME”, aby uzyskać godzinę, minuty i sekundy
Enrique
Myślę, że ta odpowiedź jest krótkim i jasnym rozwiązaniem. Wolę to.
Roman Matveev
18

Jeśli registrationpole jest rzeczywiście typu TIMESTAMP, powinieneś być w stanie zrobić:

$sql = "SELECT user.email, 
           info.name, 
           DATE(user.registration), 
           info.news
      FROM user, 
           info 
     WHERE user.id = info.id ";

a rejestracja powinna być wyświetlana jako rrrr-mm-dd

cs0lar
źródło
Próbowałem, ale otrzymuję ten sam wynik: zamiast wartości pola wyświetlana jest DATA (user.registration)
remyremy
jak ktoś zasugerował, czy możesz pomyślnie uruchomić zapytanie bezpośrednio za pomocą klienta mysql? Nie słyszałem o funkcji RequeteSQL, co ona właściwie robi?
cs0lar
Niestety nie jestem w stanie używać klienta mysql bezpośrednio, nie mam mój własny serwer ... Mam pod warunkiem requeteSQL, w zasadzie to po prostu uruchomić kwerendę i testu jeśli błąd wysyłać e-maile ...
remyremy
2
W rzeczywistości zdałem sobie sprawę, że moje pole było typu WIELKIEGO, a nie TIMESTAMP. Tylko treść była znacznikiem czasu (1328649722), więc dlatego nie działała. Teraz wszystko jest w porządku z FROM_UNIXTIME!
remyremy,
Działa dobrze. Próbowałem z datetime, ponieważ potrzebowałem tylko porcji daty.
ericsicons,
10

Wystarczy użyć funkcji DATE mysql:

mysql> select DATE(mytimestamp) from foo;
Morey
źródło
5
SELECT DATE(UNIX_TIMESTAMP())pluje NULLw moim MySQL 5.7.14
Xenos
spróbuj DATE (CURRENT_TIMESTAMP ())
Morey,
7

Powinieneś przekonwertować timestampna date.

select FROM_UNIXTIME(user.registration, '%Y-%m-%d %H:%i:%s') AS 'date_formatted'

FROM_UNIXTIME

Jaydeep Mor
źródło
2

Jeśli otrzymujesz zapytanie w danych wyjściowych, musisz pokazać nam kod, który faktycznie odzwierciedla wynik. Czy umiesz opublikować kod wywołujący requeteSQL?

Na przykład, jeśli użyłeś pojedynczych cudzysłowów w php, to wypisze nazwę zmiennej, a nie wartość

echo 'foo is $foo'; // foo is $foo

Brzmi dokładnie jak twój problem i jestem przekonany, że to jest przyczyna.

Spróbuj także usunąć symbol @, aby sprawdzić, czy to pomoże, zwiększając ilość informacji.

po to aby

$SQL_result = @mysql_query($SQL_requete); // run the query

staje się

  $SQL_result = mysql_query($SQL_requete); // run the query

Spowoduje to zatrzymanie pomijania błędów, jeśli zapytanie zgłosi błąd.

Fraser
źródło
2

Zrobiłem to z funkcją „data”, jak opisano tutaj :

(SELECT count(*) as the-counts,(date(timestamp)) as the-timestamps FROM `user_data` WHERE 1 group BY the-timestamps)
Emanuel Graf
źródło
2

FROM_UNIXTIME(unix_timestamp, [format]) to wszystko czego potrzebujesz

FROM_UNIXTIME(user.registration, '%Y-%m-%d') AS 'date_formatted'

FROM_UNIXTIMEpobiera wartość liczbową i przekształca ją w DATEobiekt
lub jeśli otrzyma ciąg formatu, zwraca go jako ciąg.

Starszym rozwiązaniem było pobranie początkowego obiektu daty i sformatowanie go za pomocą drugiej funkcji DATE_FORMAT... ale nie jest to już konieczne

d.raev
źródło
1

Próbować:

SELECT strftime("%Y-%d-%m", col_name, 'unixepoch') AS col_name

Sformatuje znacznik czasu w milisekundach do ciągu rrrr-mm-dd.

Witalij A.
źródło