tables - mysql create table example
MySQL seleccionando la fecha de ayer (7)
¿Cómo puedo visualizar y contar los valores cuyas fechas son ayer? Usé time()
para insertar la fecha en la base de datos. Ejemplo:
URL: google.com youtube.com google.com youtube.com test.com youtube.com
DateVisited: 1313668492 1313668540 1313668571 13154314
Quiero mostrar cuántas URL tienen múltiples en la tabla y también cuántas de esa URL se han visitado ayer. Ejemplo de resultado:
LINK | timesExisted | timesVisitedYesterday
Google.com | 2 | 2
youtube.com| 3 | 3
Ya tengo la idea de obtener la fecha de ayer, pero no tengo idea de contar cuántas veces ha existido una URL para ayer y contar cuántas veces ha existido una URL en la tabla.
Consulta de las últimas semanas:
SELECT *
FROM dual
WHERE search_date BETWEEN SUBDATE(CURDATE(), 7) AND CURDATE()
He adaptado una de las respuestas anteriores de cdhowie porque no pude hacerlo funcionar. Esto parece funcionar para mí. Sospecho que también es posible hacer esto con la función UNIX_TIMESTAMP utilizada.
SELECT * FROM your_table
WHERE UNIX_TIMESTAMP(DateVisited) >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
AND UNIX_TIMESTAMP(DateVisited) <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));
La forma más simple y mejor para obtener la fecha de ayer es:
subdate(current_date, 1)
Su consulta sería:
SELECT
url as LINK,
count(*) as timesExisted,
sum(DateVisited between UNIX_TIMESTAMP(subdate(current_date, 1)) and
UNIX_TIMESTAMP(current_date)) as timesVisitedYesterday
FROM mytable
GROUP BY 1
Para los curiosos, la razón por la que sum(condition)
le da el recuento de filas que satisfacen la condición, que de otra manera requeriría una declaración de case
engorrosa y prolija, es que en mysql los valores booleanos son 1
para verdadero y 0
para falso, por lo que una condición efectivamente cuenta cuántas veces es verdad. El uso de este patrón puede mejorar tu código SQL.
Puede obtener la fecha de ayer usando la expresión CAST(NOW() - INTERVAL 1 DAY AS DATE)
. Entonces algo como esto podría funcionar:
SELECT * FROM your_table
WHERE DateVisited >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
AND DateVisited <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));
Puedes usar:
SELECT SUBDATE(NOW(), 1);
o
SELECT SUBDATE(NOW(), INTERVAL 1 DAY);
o
SELECT NOW() - INTERVAL 1 DAY;
o
SELECT DATE_SUB(NOW(), INTERVAL 1 DAY);
Si bien la respuesta elegida es correcta y más concisa, argumentaría a favor de la estructura observada en otras respuestas:
SELECT * FROM your_table
WHERE UNIX_TIMESTAMP(DateVisited) >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
AND UNIX_TIMESTAMP(DateVisited) <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));
Si solo necesita una fecha simple sin marca de tiempo, también puede escribirla de la siguiente manera:
SELECT * FROM your_table
WHERE DateVisited >= CAST(NOW() - INTERVAL 1 DAY AS DATE)
AND DateVisited <= CAST(NOW() AS DATE);
La razón para usar CAST
versus SUBDATE
es CAST
es la sintaxis ANSI SQL. SUBDATE
es una implementación específica de MySQL del componente aritmético de fecha de CAST
. Adquirir el hábito de usar la sintaxis ANSI puede reducir los dolores de cabeza si alguna vez tiene que migrar a una base de datos diferente. También es bueno tener el hábito como práctica profesional, ya que seguramente trabajará con otros SGBD en el futuro.
Ninguno de los principales sistemas DBMS cumple totalmente con ANSI, pero la mayoría de ellos implementan el amplio conjunto de sintaxis ANSI, mientras que casi ninguno de ellos fuera de MySQL y sus descendientes (MariaDB, Percona, etc.) implementará la sintaxis específica de MySQL.
SELECT SUBDATE(NOW(),1);
donde la función now () vuelve a registrar la fecha y hora actual del sistema en Timestamp ...
puedes usar:
SELECT SUBDATE(CURDATE(),1)