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