我正在尝试使用Google Apps脚本中的这个简单代码读取MySQL数据库记录:
function testConn(){
// make the connection
var connection = Jdbc.getConnection("jdbc:mysql://" + DB.URL + ":" + DB.PORT + "/" + DB.DATABASE, DB.USERNAME, DB.PASSWORD);
// perform the query
var SQLstatement = connection.createStatement();
var result = SQLstatement.executeQuery("SELECT date_available FROM oc_product where model = 'B23-U57-U57'");
var colNum = result.getMetaData().getColumnCount();
while(result.next()) {
var res = {};
for (var i=1; i<= colNum; i++) {
var label = result.getMetaData().getColumnLabel(i);
if (result.getMetaData().getColumnTypeName(i) == "DATE") {
var val = result.getDate(i);
} else {
var val = result.getString(i);
}
res[label] = (val);
}
Logger.log(JSON.stringify(res, null, 4));
}
}
因为date_available
是“0000-00-00”,所以此代码会抛出错误
值'0000-00-00'不能表示为
根据建议here我尝试使用带参数
的连接网址?zeroDateTimeBehavior=convertToNull
但那也引发了错误
不支持以下连接属性:zeroDateTimeBehavior。
我错过了什么?这是Google的错误吗?为什么不支持此连接属性?有没有改变SQL查询的解决方法?
答案 0 :(得分:0)
不幸的是,不是没有改变SQL。但是作为参考,这是改变SQL的方式:
我已使用此建议:How to convert timestamp to datetime in MySQL?。并在MySql中使用FROM_UNIXTIME()
函数。唯一的缺点是,电子表格中的导入日期为1970-01-01 00:00:00.0
对我而言,这对我来说不是问题。
示例:
var rs = stmt.executeQuery("SELECT `Subscriptions`.`SubscriptionId`,
`Subscriptions`.`ItemId`, `Subscriptions`.`AccountId`,
`Subscriptions`.`ContactId`,
from_unixtime( unix_timestamp(TIMESTAMP( `Subscriptions`.`DateStart` ) ) ),
from_unixtime( unix_timestamp(TIMESTAMP( `Subscriptions`.`DateEnd` ) ) ),
`Subscriptions`.`AutoRenewal`,`Subscriptions`.`Invoice` from `Subscriptions`")
答案 1 :(得分:0)
我通过两次传递日期来解决这个问题,一旦转换为秒,然后是实际日期值:
"SELECT TO_SECONDS(date_available), date_available FROM oc_product where model = 'B23-U57-U57'"
接下来,检查零日期,不在结果过程中包含它:
var val;
var da = results.getDouble(1);
if(da === 0) val = null;
else var = new Date(results.getString(2));