Convierta la marca de tiempo a la fecha en la consulta MySQL

188

Quiero convertir un timestampen MySQL a una fecha.

Me gustaría formatear el campo user.registration en el archivo de texto como a yyyy-mm-dd.

Aquí está mi SQL:

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

También probé la conversión de fecha con:

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

Repito el resultado antes de escribir el archivo de texto y obtengo:

email1; nombre1; DATE_FORMAT (registro de usuario, '% d /% m /% Y'); noticias1

correo electrónico2; nombre2; noticias2

¿Cómo puedo convertir ese campo hasta la fecha?

remyremy
fuente
¿Está guardando el archivo exactamente así? ¿Cuál es el código que está utilizando para ejecutar la consulta SQL?
seanbreeden
1
Edité mi pregunta, requeteSQL está ejecutando la consulta
remyremy

Respuestas:

373
DATE_FORMAT(FROM_UNIXTIME(`user.registration`), '%e %b %Y') AS 'date_formatted'
Yatin
fuente
2
A partir de MySQL 5.6.23, encuentro que el valor de FROM_UNIXTIME () debe ingresarse directamente: es decir, DATE_FORMAT (FROM_UNIXTIME (user.registration), '% e% b% Y') AS 'date_formatted'
JESii
SELECT * FROM users WHERE DATE_FORMAT (FROM_UNIXTIME ( users. user_created_at), '% Y-% b-% e') = '2015-03-06' es este formato correcto o debería modificarlo?
Dheeraj Thedijje
2
@DheerajThedijje esto aparece como 2018-Nov-6. Es posible que esté buscando '%Y-%m-%d'como formatearlo en PHP (date('Y-m-d',$row->user_created_at)): esto (ambas variantes, SQL y PHP) aparece como 2018-11-06
Chris S.
En caso de que desee agregar el tiempo de esta manera "hh: mm: ss", agréguelo a la cadena de formato '% H:% i:% s'
luis.ap.uyen
64

Convierta la marca de tiempo a la fecha en MYSQL

Haga la tabla con una marca de tiempo entera:

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

Insertar algunos valores

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

Echar un vistazo

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

Convierta el número en una marca de tiempo:

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)

Conviértalo a un formato legible:

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
fuente
por favor fijar% h a% H
Tomot
61

Para obtener una cita, puedes casthacerlo

cast(user.registration as date)

y para obtener un formato específico use date_format

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

Demostración de SQLFiddle

juergen d
fuente
Da el mismo resultado, se muestra emitir (registro de usuario como fecha) en lugar del valor del campo
remyremy
55
Sin embargo, esto funcionó - cast (from_unixtime (user.registration) AS date)
Eric Ness
tengo un formato de fecha específico que funcionó para mí lo mejor posible gracias
saber tabatabaee yazdi
use "como DATETIME" para obtener horas minutos y segundos también
Enrique
Creo que esta respuesta es la solución corta y clara. Prefiero esto.
Roman Matveev
18

Si el registrationcampo es de tipo TIMESTAMP, debería poder hacer:

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

y el registro debe aparecer como aaaa-mm-dd

cs0lar
fuente
Lo intenté pero obtengo el mismo resultado: DATE (user.registration) se muestra en lugar del valor del campo
remyremy
como alguien sugirió, ¿puede ejecutar la consulta con éxito utilizando el cliente mysql directamente? No he oído hablar de la función requeteSQL, ¿qué hace exactamente?
cs0lar
Desafortunadamente no puedo usar un cliente mysql directamente, no tengo mi propio servidor ... He proporcionado requeteSQL, básicamente solo ejecuta la consulta y prueba si hay un error al enviar correos electrónicos ...
remyremy
2
En realidad, me di cuenta de que mi campo era de tipo BIGINT y no de TIMESTAMP. Solo el contenido era una marca de tiempo (1328649722), por eso no funcionó. ¡Ahora todo está bien con FROM_UNIXTIME!
remyremy
Esto funciona bien. Lo probé con datetime, ya que solo necesitaba obtener la parte de la fecha.
ericsicons
10

Simplemente use la función DATE de mysql:

mysql> select DATE(mytimestamp) from foo;
Morey
fuente
55
SELECT DATE(UNIX_TIMESTAMP())escupe NULLen mi MySQL 5.7.14
Xenos
pruebe DATE (CURRENT_TIMESTAMP ())
Morey
7

Deberías convertir timestampa date.

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

FROM_UNIXTIME

Jaydeep Mor
fuente
2

Si recibe la consulta en su salida, debe mostrarnos el código que realmente refleja el resultado. ¿Puedes publicar el código que llama a requeteSQL?

Por ejemplo, si ha usado comillas simples en php, imprimirá el nombre de la variable, no el valor

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

Esto suena exactamente como su problema y estoy seguro de que esta es la causa.

Además, intente eliminar el símbolo @ para ver si eso ayuda al brindarle más información.

así que eso

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

se convierte

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

Esto detendrá cualquier supresión de errores si la consulta arroja un error.

Fraser
fuente
2

Lo hice con la función 'fecha' como se describe aquí :

(SELECT count(*) as the-counts,(date(timestamp)) as the-timestamps FROM `user_data` WHERE 1 group BY the-timestamps)
Emanuel Graf
fuente
2

FROM_UNIXTIME(unix_timestamp, [format]) es todo lo que necesitas

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

FROM_UNIXTIMEobtiene un valor numérico y lo transforma en un DATEobjeto,
o si se le da una cadena de formato, lo devuelve como una cadena.

La solución anterior era obtener el objeto de fecha inicial y formatearlo con una segunda función DATE_FORMAT... pero esto ya no es necesario

d.raev
fuente
1

Tratar:

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

Formateará la marca de tiempo en milisegundos a cadena aaaa-mm-dd.

Vitaliy A
fuente