如何根据使用sequelize传递的时区获取一系列日期中的数据

问题描述 投票:0回答:2

我正在尝试获取createdAt字段位于指定时区的日期范围之间的数据。这是我到目前为止所拥有的,但这并没有返回指定日期范围和时区的正确数据。数据库中的 createdAt 值的示例如下

2022-06-14 02:37:16.236+00

let timezone = req.header('Timezone')
if (!timezone || !moment.tz.zone(timezone)) {
    timezone = moment.tz.guess();
}

const startOfDay = moment(date).tz(timezone).startOf('day')
const endOfDay = moment(startOfDay).endOf('day')

// Fetch all completed events within the date range
const events = await models.Event.findAll({
    attributes: [
      'id',
      'accuracy',
    ],
    where: {
      status: 'completed',
      createdAt: {
        [Op.between]: [startOfDay, endOfDay],
      },
    },
    order: [['createdAt', 'ASC']],
    raw: true,
  })
sql node.js postgresql orm sequelize.js
2个回答
1
投票

您必须使用 PostgreSQL 的时区格式将时刻日期格式化为任何可接受的日期和时间。例如,

startOfDay.format("YYYY-MM-DD HH:mm:ss z")

所以代码应该是这样的:

let timezone = req.header('Timezone')
if (!timezone || !moment.tz.zone(timezone)) {
    timezone = moment.tz.guess();
}

const startOfDay = moment(date).tz(timezone).startOf('day').format("YYYY-MM-DD HH:mm:ss z")
const endOfDay = moment(startOfDay).endOf('day').format("YYYY-MM-DD HH:mm:ss z")

// Fetch all completed events within the date range
const events = await models.Event.findAll({
    attributes: [
      'id',
      'accuracy',
    ],
    where: {
      status: 'completed',
      createdAt: {
        [Op.between]: [startOfDay, endOfDay],
      },
    },
    order: [['createdAt', 'ASC']],
    raw: true,
  })

0
投票

对于续集原始查询mysql,您应该使用 moment(your_time).format('YYYY-MM-DDTHH:mm:ssZ'); 这将解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.