【问题标题】:PostgreSQL Date is one day off with my QueryPostgreSQL 日期是我查询的一天
【发布时间】:2020-01-27 12:12:57
【问题描述】:

我正在开发一个连接到 PostgresDB 的带有 Expo 的 React Native 应用程序。

我有一个查询,它在两个日期之间加载一些数据,如下所示:

db.query(
      `SELECT activitydate, phaseid, time, userid, remark, zkub, status, hours_status.color status_color, comment, project.name project_name
      FROM hours 
      LEFT JOIN phase ON phase.id = hours.phaseid
      LEFT JOIN project ON project.id = phase.projectid 
      LEFT JOIN hours_status ON hours_status.statusid = hours.status
      WHERE activitydate >= '${startDate}' AND activityDate <= '${endDate}'
      AND userid = '${userid}' ORDER BY activitydate`

... startDate is 2019-08-01 and endDate is 2019-08-31 in this example ! 

它确实给了我我需要的数据(示例):

{"activitydate":"2019-07-31T22:00:00.000Z","phaseid":766x7,"time":180,"userid":1xx,"remark":"I did this and that","zkub":" ","status":0,"status_color":"000000","comment":"","project_name":"coolProject"}
... of course this is 1 Element from the Array ! 

现在的问题是活动日期应该是:“2019-08-01”,但它是“2019-07-31”,即使它在具有正确活动日期的数据库中正确安全。

当我在浏览器中使用 localhost/api/... 获取数据时不仅错误,而且在我的应用程序中也显示错误。

我认为这可能与设置的时间戳有关?如您所见,它设置为T22:00:00.000Z。我不知道浏览器或 nodejs(express) 可能使用哪个日期,但它会将结果推迟 1 天。

【问题讨论】:

  • 你在db中的activitydate中存储了什么???
  • 我存储了一个日期。它的类型为 date ,在 db 内部看起来像这样:2019-08-01 如果我查询它看起来像上面。
  • 这主要发生在您从 UTC 转换到系统特定时区时。您是否尝试过考虑输出时区的转换?
  • 是的,我考虑过——但查询本身并没有在我的应用程序中运行,只是在我的后端应该给我正确的日期——有没有办法告诉我查询/nodejs/或其他东西否则使用 UTC 或最后也使用 T22:00:00.000Z 或其他东西

标签: javascript node.js postgresql react-native express


【解决方案1】:

如果您想获取两个日期之间的记录,请使用

WHERE activitydate between `${startDate}` and `${endDate}`

还要确保您以正确的格式传递您的日期,例如YYYY-MM-DD

使用时刻我们可以将我们的日期格式化为所需的格式

 moment(our_date).format('YYYY-MM-DD')  // npm install moment --save

因此,当您获得结果时,然后将结果活动日期传递给时刻,它将以 YYYY-MM-DD 格式返回日期

尝试使用 format(datee,'dd - MM - yyyy') 之类的函数

SELECT DATE_FORMAT(activitydate, "%Y-%m-%d") // try instead of activitydate 

【讨论】:

  • 我也试过这个查询版本,它给我返回完全相同的数据。是的,我已经在我的应用程序中使用 MomentJS 并正确格式化它。这就是为什么它很奇怪,我认为它与 T22:00:00.000Z 有关系
  • 你试过了吗?当你得到你的日期活动日期然后将它传递给时刻(活动日期)。格式('YYYY-MM-DD')
  • 您也可以在您的应用中使用 moment-timezone 设置您的时区
  • 好的,我明白你的意思了,但现在想象一下我只是输入:localhost/api/startdate/enddate/userid 并在浏览器中获取 JSON 数组,而不考虑我的应用程序。然后它应该给我返回具有正确活动日期值的数组,因为它正确存储在数据库上,但它有 1 天的休息时间 - 是否可以在查询中或在可以附加 T22:00 的快速服务器上设置一些东西: 00.000Z 还是什么?你明白我的意思吗:D
  • 如果你能找到解决方案,那就太疯狂了——但我已经感谢你的努力了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 1970-01-01
  • 2011-04-23
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多