Расхождение даты в SQL с некоторыми датами - PullRequest
0 голосов
/ 27 февраля 2019

Я работаю над проблемой с датой.

Итак, в приложении у меня есть таблица, в которой есть несколько пользовательских записей, в которые входит поле даты рождения (тип datetime sql).Проблема заключается в том, что для некоторых пользователей, чья дата рождения предшествует 1954 году, эта дата не отображается должным образом.

Например, у меня есть пользователь, чья дата рождения 11/08/1920 , но когда я устанавливаю дату рождения с помощью серверного скрипта, она заканчивается значением 11/07/1920 23: 23: 24 .

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

function importDOBs(){

  var allRecs = [];

  var ss = SpreadsheetApp.openById("adfsasdfasdfasdfasdfasdf");
  var sheet = ss.getActiveSheet();

  var data = sheet.getRange(2,4,sheet.getLastRow(),2).getValues();
  for(var i=0; i<5; i++){
    var row = data[i];
    var date = row[0];
    var oldMrn = row[1];

    var query = app.models.purgedRecords.newQuery();
    query.filters.oldMrn._equals = oldMrn;
    var record = query.run()[0];
    if(record){
      var dob = new Date(date);
      record.dateOfBirth = dob;
      allRecs.push(record);
    }
  }

  app.saveRecords(allRecs);

}

Это значенияв таблице (это строки, а не даты):

1954-03-04T00:00:00
2014-03-01T00:00:00
1951-10-20T00:00:00
1920-11-08T00:00:00
1938-09-27T00:00:00

Тем не менее, я всегда получаю это:

enter image description here

Как видите, есть расхождения в датах, предшествующих 1954 году. До сих пор я пробовал другие вещи, такие как изменение этой части:

if(record){
  var dob = new Date(date);
  record.dateOfBirth = dob;
  allRecs.push(record);
}

на эту:

if(record){
  var dob = Utilities.formatDate(new Date(date),"GMT","yyyy-MM-dd'T'HH:mm:ss'Z'");
  var birthDate = new Date(dob);
  record.dateOfBirth = birthDate;
  allRecs.push(record);
}

и вышесказанное привело к тому же.Я пробовал другие даты после 1954 года, и они тоже кажутся неправильными.Например, 05/19/1968 отражает 05/18/1968 23: 00: 00 .Так что, на мой взгляд, это связано с переходом на летнее время, возможно?

1 Ответ

0 голосов
/ 28 февраля 2019

Змеиная яма преобразования дат между платформами image

Попробуйте установить значения в UTC или просто отформатируйте их в формате datetime для MySQL

Первый вариант, показанный во фрагменте ниже, требует, чтобы вы преобразовали формат в SQL:

См. Этот ответ: MySQL yyyy-mm-ddThh: mm: ss.sssZ в yyyy-mm-ddчч: мм: сс

DATE_FORMAT(STR_TO_DATE(«string»,'%Y-%m-%dT%H:%i:%s.000Z'),'%Y-%m-%d %H:%i:%s');

//Using Z to set to UTC

let allRecs = [];
document.querySelector("pre").textContent.split("\n").forEach(function(element) {
  if (element != "") {
    const dob = new Date(element + "Z"); //Z forces te date to be in UTC with zero time offzet or: 00:00:00
    const dateOfBirth = dob;
    allRecs.push(dateOfBirth);
  }
});
console.log(allRecs);

allRecs = [];
//format to MySQL datetime format
document.querySelector("pre").textContent.split("\n").forEach(function(element) {
  if (element != "") {
    element = element.replace("T", " "); //replace T with space
    //now the string is in the datetime format for MySQL
    allRecs.push(element);
  }
});
console.log(allRecs);

1954-03-04T00:00:00
2014-03-01T00:00:00
1951-10-20T00:00:00
1920-11-08T00:00:00
1938-09-27T00:00:00
...