При сравнении даты продолжения вставлено неправильное время - PullRequest
0 голосов
/ 18 июня 2020

Sequelize автоматически вставляет неправильную метку времени.

где-то в моем коде, который я делаю ниже:

fromdate = moment(fromdate).format('YYYY-MM-DD'); 
todate = moment(todate).add(1, 'days').format('YYYY-MM-DD');
whereclause['order_date'] = { [Op.between]: [fromdate, todate] };

, а запрос SQL, который создается, выглядит следующим образом:

`MyTable`.`mydatetimecolumn` BETWEEN '2020-06-18 04:00:00' AND '2020-06-19 04:00:00';

откуда взялось это 04:00:00? * Столбец 1009 *

определен в своей сущности, как показано ниже:

mydatetimecolumn: {
            type: DataTypes.DATE
        }

Я использую sequelize 5.21.2 с mysql . Я не понимаю, что может пойти не так. Хотя кажется, что sequelize - это автоматическая вставка часов часового пояса, но почему, как выключить его или предоставить что-то еще?

даже если я сделаю .format('YYYY-MM-DD 00:00:00'), он все равно заменит его на 4:00:00.

1 Ответ

1 голос
/ 18 июня 2020

«Откуда это 04:00:00?», Оно пришло из ВАШЕГО часового пояса. Ваш сервер должен быть настроен на GMT-4. mysql использует GMT, но ваш скрипт / ОС использует GMT-4. Это «правильно» (с учетом разных интерпретаций «правильного»).

Попробуйте установить часовой пояс при подключении.

const sequelize = new Sequelize(mysql.database, mysql.user, mysql.password, {
    host: mysql.host,
    port:3306,
    dialect:'mysql',
    define: {
      underscored: true,
      freezeTableName: true, //use singular table name
      timestamps: false,  // I do not want timestamp fields by default
    },
    dialectOptions: {
      useUTC: false, //for reading from database
      dateStrings: true,
      typeCast: function (field, next) { // for reading from database
        if (field.type === 'DATETIME') {
          return field.string()
        }
          return next()
        },
    },
    timezone: '-04:00'
});
...