es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo recuperar datos en una base de datos con fecha y hora UTC.

Necesito obtener unos datos en nuestra base de datos como informe utilizando Ruby on Rails, pero tengo un problema con la fecha/hora, por ejemplo:

Esta orden se realizó en:

Laser beam

pero en nuestra base de datos está fechada con 8 horas más porque lo guardamos como UTC:

View post on imgur.com

Luego tengo una consulta:

Spree::Order
            .joins(user:[:corporate_account])
            .includes(line_items:[:variant])
            .where('spree_orders.completed_at IS NOT NULL')
            .ransack(@params[:q])

La fecha de inicio y fecha fin se convierten en:

@params[:q][start_date] = params[:q][start_date].to_datetime.beginning_of_day
@params[:q][end_date]   = params[:q][end_date].to_datetime.end_of_day

para obtener los pedidos desde las 12:00 a.m. hasta las 11:59:59 p.m. del día.

No se me permite cambiar cómo se guarda la fecha/hora en nuestra base de datos y no podemos hacer un corte.

También intenté convertir PST a UTC pero no funciona porque, por ejemplo, si quiero generar un informe a las 5 p.m. de hoy con una fecha del 2021/12/01, tengo que convertirlo al final del día, es decir, 2021/12/01 11:59:59, no incluirá los pedidos realizados a las 5 p.m. del 2021/12/01 porque estará desfasado en la base de datos con 8 horas, será guardado como 2021/12/02 1 a.m..

Entonces mi pregunta es, ¿cómo haría una consulta para obtener datos con tal desfase de fecha/hora?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en Ruby on Rails, bases de datos, fechas y zonas horarias, mi enfoque para el problema es el siguiente:

    Para hacer consultas de datos con un desfase de fecha y hora en la base de datos, es necesario convertir el rango de fechas de la consulta a la zona horaria UTC. Esto se puede hacer sumando o restando el desfase al rango de fechas de la consulta.

    Aquí hay un ejemplo:

    Supongamos que deseas generar un informe desde el 1 de diciembre de 2021 hasta el 5 de diciembre de 2021. Tu consulta se verá algo así:

    start_date = Time.zone.parse('2021-12-01 00:00:00')
    end_date = Time.zone.parse('2021-12-05 23:59:59')
    
    Spree::Order
      .joins(user:[:corporate_account])
      .includes(line_items:[:variant])
      .where('spree_orders.completed_at IS NOT NULL')
      .where(completed_at: start_date..end_date)
    

    Ahora, para manejar el desfase de fecha y hora, es necesario convertir start_date y end_date a la zona horaria UTC. Esto se puede hacer utilizando el método in_time_zone.

    start_date = Time.zone.parse('2021-12-01 00:00:00').in_time_zone('UTC')
    end_date = Time.zone.parse('2021-12-05 23:59:59').in_time_zone('UTC')
    
    Spree::Order
      .joins(user:[:corporate_account])
      .includes(line_items:[:variant])
      .where('spree_orders.completed_at IS NOT NULL')
      .where(completed_at: start_date..end_date)
    

    Al convertir el rango de fechas de la consulta a la zona horaria UTC, podrás consultar datos con el desfase de fecha y hora de manera correcta. Este enfoque te permite obtener los datos en tu base de datos como un informe utilizando Ruby on Rails sin hacer cambios en la forma en que las fechas se guardan en la base de datos.

Comments are closed.