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.

PinoyStackOverflower
fuente

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.

Bohemio
fuente
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)
Romancha KC
fuente
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);
simhumileco
fuente
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));
cdhowie
fuente
9

Consulta de las últimas semanas:

SELECT *
FROM dual
WHERE search_date BETWEEN SUBDATE(CURDATE(), 7) AND CURDATE()
NCrash
fuente
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)
Atequer Rahman
fuente
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.

trclark81
fuente
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));
John-Paul Stanford
fuente