KNEX добавляет дополнительную информацию к отметке времени в ответе сервера, даже если dateStrings: true

#node.js #sql-server #datatables #knex.js

#node.js #sql-сервер #таблицы данных #knex.js

Вопрос:

Я использую KNEX, Node / Express, MSSQL (TSQL) и библиотеки DataTables / Editor.

Я не понимаю, что происходит с моими временными метками. Мне нужно вернуть ДАТУ и ВРЕМЯ, но дополнительная информация добавляется к обоим.

Я запрашиваю представление MSSQL с помощью KNEX в Node:

     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'
       }
}
  

Можете ли вы указать мне правильное направление?

Комментарии:

1.Почему бы не проанализировать (вы можете просто использовать new Date() ) дату, а затем отформатировать ее так, как вам нравится?

2. Я работаю над предположением, что это должно быть «встроено» в библиотеки, поскольку, похоже, есть варианты для MySQL, Oracle, Postgres…. они говорят, что это в драйвере (утомительно?). В любом случае, одна из моих мыслей заключалась в том, чтобы преобразовать данные в varchar или что-то в этом роде. Кроме того, moment.js и таблицы данных вроде как заботятся о преобразовании времени.

3. JavaScript имеет только тип данных Date , который на самом деле является датой со временем. У него нет отдельных типов данных Date (только для даты) и Time. Вы можете предоставить пользовательские заменители для JSON.stringify() и восстановители для JSON.parse() , если вам нужно другое поведение.

4. AFAIK dateStrings: true работает только для mysql.

Ответ №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/