从Google Sheet将可用日期写入MySQL

从Google Sheet将可用日期写入MySQL,mysql,google-apps-script,jdbc,google-cloud-sql,google-data-studio,Mysql,Google Apps Script,Jdbc,Google Cloud Sql,Google Data Studio,我有一个脚本,它将google工作表中的数据写入google Cloud MySQL表,但我希望有data Studio可以使用的日期。我尝试过使用日期、日期时间和时间戳,但得到了相同的错误: 试图在DBTestData中更新表sampledata,但返回以下错误:异常:数据截断:第1行“dateordered”列的日期时间值不正确:“2019年1月1日星期二00:00:00 GMT-0500(东部标准时间)” 我曾尝试在DataStudio中使用ToDate函数将其更改为日期,但它仍然无法识别

我有一个脚本,它将google工作表中的数据写入google Cloud MySQL表,但我希望有data Studio可以使用的日期。我尝试过使用日期、日期时间和时间戳,但得到了相同的错误:

试图在DB
TestData
中更新表
sampledata
,但返回以下错误:异常:数据截断:第1行“dateordered”列的日期时间值不正确:“2019年1月1日星期二00:00:00 GMT-0500(东部标准时间)”

我曾尝试在DataStudio中使用
ToDate
函数将其更改为日期,但它仍然无法识别。我觉得我的头撞到了墙上,想得到一些新的想法如何做到这一点。这是在GAS中运行以写入MySQL表的脚本

function LessCo1() {

  var sheetName = 'Sheet';

  var dbAddress = 'Address';
  var dbUser = 'User';
  var dbPassword = 'Pass';
  var dbName = 'TestData';
  var dbTableName = 'sampledata';

  var dbURL = 'jdbc:mysql://' + dbAddress + '/' + dbName;

  var sql = "INSERT INTO " + dbTableName + " (name, productkey, businesspartner, dateordered, price, quantity, promisedate, deliverydate, deliveredqty, market, doctype, docstat, docno, orderref) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
  
  var maxRecordsPerBatch = 50;

  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName(sheetName);
  
  var sheetData = sheet.getRange(1, 1, 10000, 14).getValues();

  var dbConnection = Jdbc.getConnection(dbURL, dbUser, dbPassword);

  var dbStatement = dbConnection.prepareCall(sql);
  
  var name, productkey, businesspartner, dateordered, price, quantity, promisedate, deliverydate, deliveredqty, market, doctype, docstat, docno, orderref;

  var recordCounter = 0;
  var lastRow;

  dbConnection.setAutoCommit(false);

  for (var i = 1; i <= 9000; i++) 
  {

    lastRow = (i + 1 == sheetData.length ? true : false);
    
    name = sheetData[i][0];
    productkey = sheetData[i][1];
    businesspartner = sheetData[i][2];
    dateordered = sheetData[i][3];
    price = sheetData[i][4];
    quantity = sheetData[i][5];
    promisedate = sheetData[i][6];
    deliverydate = sheetData[i][7];
    deliveredqty = sheetData[i][8];
    market = sheetData[i][9];
    doctype = sheetData[i][10];
    docstat = sheetData[i][11];
    docno = sheetData[i][12];
    orderref = sheetData[i][13];
    
    
    dbStatement.setString(1, name);
    dbStatement.setString(2, productkey);
    dbStatement.setString(3, businesspartner);
    dbStatement.setString(4,dateordered);
    dbStatement.setString(5, price);
    dbStatement.setString(6, quantity);
    dbStatement.setString(7, promisedate);
    dbStatement.setString(8, deliverydate);
    dbStatement.setString(9, deliveredqty);
    dbStatement.setString(10, market);
    dbStatement.setString(11, doctype);
    dbStatement.setString(12, docstat);
    dbStatement.setString(13, docno);
    dbStatement.setString(14, orderref);

    dbStatement.addBatch();

    recordCounter += 1;

    if (recordCounter == maxRecordsPerBatch || lastRow)
    {
      try {
        dbStatement.executeBatch();
      }
      catch(e)
      {
        console.log('Attempted to update TABLE `' + dbTableName + '` in DB `' + dbName + '`, but the following error was returned: ' + e);
      }

      if (!lastRow)
      { 
        dbStatement = dbConnection.prepareCall( sql );
        recordCounter = 0;
      }
    }
  }

  dbConnection.commit();
  dbConnection.close();
}
函数LessCo1(){
var sheetName=‘Sheet’;
var dbAddress='Address';
var dbUser='User';
var dbPassword='Pass';
var dbName='TestData';
var dbTableName='sampledata';
var dbURL='jdbc:mysql://'+dbAddress+'/'+dbName;
var sql=“插入“+dbTableName+”(名称、产品密钥、业务伙伴、订购日期、价格、数量、承诺日期、交货日期、交货数量、市场、doctype、docstat、docno、orderref)值(?,,,,,,,,,,,,,,,,;”;
var maxRecordsPerBatch=50;
var电子表格=SpreadsheetApp.getActiveSpreadsheet();
var sheet=电子表格.getSheetByName(sheetName);
var sheetData=sheet.getRange(1,1,10000,14).getValues();
var dbConnection=Jdbc.getConnection(dbURL、dbUser、dbPassword);
var dbStatement=dbConnection.prepareCall(sql);
var名称、productkey、业务伙伴、订购日期、价格、数量、承诺日期、交货日期、交货数量、市场、doctype、docstat、docno、orderref;
var-recordCounter=0;
var lastRow;
dbConnection.setAutoCommit(false);

对于(var i=1;i传递到表中的日期格式不正确。您收到的错误告诉您字符串'Tue Jan 01 2019 00:00:00 GMT-0500(东部标准时间)不是它期望的
dateordered
列的
datetime
对象

因此,您的日期需要转换为
DATETIME-格式:YYYY-MM-DD HH:MI:SS
对象。要达到此目的,您需要使用字符串操作并删除不必要的部分。例如:

var myDate='2019年1月1日星期二00:00:00 GMT-0500(东部标准时间)';
var timeZone=myDate.slice(-1)[0].split(“GMT”);
时区[0]=“GMT”;
控制台日志(时区);
//[“格林尼治标准时间”,“-0500”]
myDate=myDate.slice(0,5).join(“”);
console.log(myDate);
//“2019年1月1日星期二00:00:00”
现在,您已经放弃了不必要的,让我们将该日期放入SQL表中,好吗

下面是一个示例,其中一列为
datetime
类型,您应该在
var-sql
中对其进行调整,使其适合您的JS代码

CREATE TABLE foo_bar (
    dateordered datetime
);
INSERT INTO foo_bar (dateordered) VALUES (CONVERT_TZ(STR_TO_DATE(myDate,"%a %b %d %Y %T"),timeZone[0],timeZone[1]));
SELECT * FROM foo_bar ;
// Output: "2018-12-31 20:00:00" 
现在,您的DB表中有一个datetime对象,该对象已转换为GMT时区,因此在从DB读取数据时,请记住这一点,在某些情况下,您可能希望使用该对象对其进行本地化

用于将日期从字符串转换为SQL日期时间


来自文档:“它采用字符串str和格式字符串格式。如果格式字符串同时包含日期和时间部分,则str\u TO\u DATE()返回日期时间值;如果字符串仅包含日期或时间部分,则返回日期或时间值。如果从str提取的日期、时间或日期时间值非法,则str\u TO\u DATE()返回NULL并产生警告。“

在这种情况下,我应该在哪里将字符串转换为正确的日期?是否有办法在脚本中而不是在MySQL中转换它?感谢您的编辑,归根结底,我需要它能够对3列(dateordered、promisedate和deliverydate)执行此操作有没有办法在我现在的函数中快速运行此功能?如果我需要将这三个条目转换为日期而不是日期时间,因为它们都记录为00:00:00?那么请从字符串中删除不必要的部分,并使用表期望的正确格式。有关格式,请参阅。