即使dateStrings:true,KNEX也会在服务器响应中向时间戳添加额外的信息

问题描述

我正在使用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,并且设置为true。

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

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

解决方法

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

我知道如何解决此问题的唯一方法是将日期强制转换/转换为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/