MySQL seleccionando la fecha de ayer


101

¿Cómo puedo mostrar y contar los valores cuyas fechas son ayer? Solía time()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 que tienen varias existieron en la tabla y también cuántas de esas URL se visitaron ayer. Resultado de ejemplo:

LINK       | timesExisted | timesVisitedYesterday
Google.com |       2      | 2
youtube.com|       3      | 3

Ya tengo la idea de obtener la fecha de ayer, pero no tengo la idea de contar cuántas veces ha existido una URL ayer y cuántas veces ha existido una URL en la tabla.

Respuestas:


166

La mejor y más sencilla forma de obtener la fecha de ayer es:

subdate(current_date, 1)

Tu 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 que sum(condition)le da el recuento de filas que satisfacen la condición, que de otro modo requeriría una casedeclaración engorrosa y prolija , es que en mysql los valores booleanos son 1verdaderos y 0falsos, por lo que la suma de una condición cuenta efectivamente cuántas veces es verdad. El uso de este patrón puede mejorar su código SQL.


89
SELECT SUBDATE(NOW(),1);

donde la función now () devuelve la fecha y hora actuales del sistema en Timestamp ...

puedes usar:

SELECT SUBDATE(CURDATE(),1)

3
Trabajó para mi. Muchas gracias
mable george

20

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);

11

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));

9

Consulta de las últimas semanas:

SELECT *
FROM dual
WHERE search_date BETWEEN SUBDATE(CURDATE(), 7) AND CURDATE()

9

Cálculo de la última o próxima fecha, semana, mes y año. Puede ser útil para cualquiera.

Fecha actual:

select curdate();

Ayer:

select subdate(curdate(), 1)

Mañana:

select adddate(curdate(), 1)

Última semana:

select between subdate(curdate(), 7) and subdate(curdate(), 1)

Próxima 1 semana:

between adddate(curdate(), 7) and adddate(curdate(), 1)

Último 1 mes:

between subdate(curdate(), 30) and subdate(curdate(), 1)

Próximo 1 mes:

between adddate(curdate(), 30) and adddate(curdate(), 1)

Mes actual:

subdate(curdate(),day(curdate())-1) and last_day(curdate());

Último 1 año:

between subdate(curdate(), 365) and subdate(curdate(), 1)

Próximo 1 año:

between adddate(curdate(), 365) and adddate(curdate(), 1)

7

Si bien la respuesta elegida es correcta y más concisa, abogaría por la estructura anotada 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 desnuda 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 CASTversus SUBDATEes la CASTsintaxis ANSI SQL. SUBDATEes 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 en caso de que alguna vez tenga que migrar a una base de datos diferente. También es bueno tener el hábito como práctica profesional, ya que es casi seguro que trabajará con otros DBMS en el futuro.

Ninguno de los principales sistemas DBMS es totalmente compatible con ANSI, pero la mayoría implementa el amplio conjunto de sintaxis ANSI, mientras que casi ninguno de ellos fuera de MySQL y sus descendientes (MariaDB, Percona, etc.) implementará una sintaxis específica de MySQL.


Buenas explicaciones de por qué uno elegiría uno sobre el otro.
Sablefoste

4

Adapté una de las respuestas anteriores de cdhowie porque no pude hacer que funcionara. Esto parece funcionar para mí. Sospecho que también es posible hacer esto con la función UNIX_TIMESTAMP que se ha utilizado.

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));
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.