【问题标题】:KNEX adds extra info to timestamp in server response even though dateStrings: trueKNEX 在服务器响应中为时间戳添加额外信息,即使 dateStrings: true
【发布时间】:2020-09-10 21:55:58
【问题描述】:

我正在使用 KNEX、Node/Express、MSSQL (TSQL) 和 DataTables/Editor 库。

我不明白我的时间戳发生了什么。我需要返回 DATE 和 TIME,但正在向两者添加额外信息。

我正在 Node 中使用 KNEX 查询 MSSQL 视图:

    db.select().table('vueMySuperCoolView')
        .where({ StartDate: date })
        .orderByRaw('StartTime, LogDate')
        .then(data => res.json({ data }))  //responds with named array of objects data:[{}]
        .catch(err => console.log(err));  //more robust error output options exist

以下是构造视图的一些逻辑:

    select
        cast(t.StartTime as date) as StartDate
        ,cast(t.StartTime as time) as StartTime

这会在我可以使用的 MS SQL Management Studio 中产生可接受的输出:

StartDate   StartTime
2020-05-21  09:30:00.0000000
2020-05-21  10:00:00.0000000
2020-05-21  10:30:00.0000000
...

但是,在服务器响应中,我的日期和时间如下所示:

            "StartDate": "2020-05-22T00:00:00.000Z",
            "StartTime": "1970-01-01T13:30:00.000Z",

在一篇支持文章中,建议将“dateString”选项设置为 true,并且确实如此。

connection: {
    user: '',
    password: '',
    database: 'DB',
    host: 'MSSQL',
    dateStrings: true,
    options: {
           instanceName: 'I'
       }
}

你能指出我正确的方向吗?

【问题讨论】:

  • 为什么不parse (你可以使用new Date() 日期,然后format 随便你喜欢它是什么?
  • 我正在假设这应该“内置”到库中,因为似乎有 MySQL、Oracle、Postgres 的选项......他们说它在司机(乏味?)。无论如何,我的一个想法是将数据转换为 varchar 或其他东西。此外,moment.js 和 DataTables 有点照顾时间转换的东西。
  • JavaScript 只有一个 Date 数据类型,它实际上是一个带时间的日期。它没有单独的日期(仅限日期)和时间数据类型。如果您想要不同的行为,您可以向JSON.stringify() 提供自定义替换器,向JSON.parse() 提供恢复器。
  • AFAIK dateStrings: true 仅适用于 mysql。

标签: node.js sql-server datatables knex.js


【解决方案1】:

如果别人的回答比我的好,我会很乐意接受。

我知道如何解决此问题的唯一方法是将日期转换/转换为varchar

    select
        convert(varchar, cast(t.StartTime as date))  as StartDate
        ,convert(varchar, cast(t.StartTime as time), 120) as StartTime  -- grouping value

在转换/转换之后,日期和时间是明确的varchar,没有附加任何额外的垃圾。它在前端可用于进一步操作(即:使用 moment.js)。

另一件事可能很重要...考虑设置options.useUTC(在返回日期/时间数据时不要让 KNEX/JS/NODE 操纵时区):

        options: {
            instanceName: 'MyInstance',
            // A boolean determining whether or not use UTC time for values without time zone offset (default: true).
            useUTC: false
        }

https://tediousjs.github.io/node-mssql/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 2018-10-23
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    相关资源
    最近更新 更多