【问题标题】:Knex get formatted time from a time column and date columnKnex 从时间列和日期列中获取格式化时间
【发布时间】:2019-05-02 22:15:25
【问题描述】:

我有一个用时间类型定义的列和一个用日期类型定义的列。

knex.schema.createTable('receipt', function(table) {
...
    table.date('t_date');
    table.time('t_time');
...
});

它将数据以 24 小时格式存储在数据库中。例如:22:00:00。日期为“2018-11-30”。但是当我运行选择查询时,它会返回。

{
...
    "transactionDate": "2018-11-29T00:00:00.000Z",
    "transactionTime": "1970-01-01T22:20:00.000Z",
...
}

如何从选择查询中获取日期格式为YYYY-MM-dd 和时间为HH:mm:ssAM/PM 的日期?

【问题讨论】:

    标签: node.js knex.js


    【解决方案1】:

    选择日期等列类型在javascript中返回的格式由数据库驱动程序完成,而不是在knex中。

    对于postgresql

    Can we always fetch date column as string (varchar) with knex and postgres?

    对于mysql

    Knexjs returning mysql timestamp, datetime columns as Javascript Date object

    应该有帮助。

    【讨论】:

    • 谢谢我现在看看,我用的是mssql驱动。
    • 没有。在我的 MySQL 表中,我得到了 YYYY-MM-DD 但 Knex 将其转换为 YYYY-MM-DD HH:mm:ss
    • 仁南,再读一遍答案。它说转换不是由 knex 进行的,而是由底层 db 驱动程序决定如何将 sql 类型转换为 javascript。对于日期列,您需要稍微修改链接答案提供的方法以适用于日期列。
    • 你们都知道如何在 MSSQL 中实现这一点吗?看起来我的问题很相似:stackoverflow.com/q/63838192/3772763
    • sql.map.register(String, sql.DateTime) 之类的东西可能会起作用。这里提到了tediousjs.github.io/node-mssql/#input-name-type-value,但听起来它可能适用于输入和输出。
    【解决方案2】:

    下一个 sn-p 对我来说就像一个魅力:

    const { setTypeParser, builtins } = require('pg').types;
    
    const typesToReset = [
      builtins.DATE,
      builtins.TIME,
      builtins.TIMETZ,
      builtins.TIMESTAMP,
      builtins.TIMESTAMPTZ,
    ];
    
    function resetPgDateParsers() {
      for (const pgType of typesToReset) {
        setTypeParser(pgType, val => String(val)); // like noParse() function underhood pg lib
      }
    }
    

    ...并在使用 pg 或库/orm 之前调用此函数取决于 pg(knex、反对等)请求。

    来源:https://github.com/Vincit/objection.js/issues/663#issuecomment-351678734console.log(pg.types)

    【讨论】:

      【解决方案3】:

      oracleDb 用户必须设置这个环境变量

      export ORA_SDTZ='UTC'
      

      更多信息:https://community.oracle.com/docs/DOC-1008911

      【讨论】:

        【解决方案4】:

        var data = {
            "transactionDate": "2018-11-29T00:00:00.000Z",
            "transactionTime": "1970-01-01T2:22:00.000Z"
        }
        
        var date = data.transactionDate.split("T")[0];
        var time = data.transactionTime.split("T")[1].split(".000Z")[0];
        let h = parseInt(time.split(":")[0]);
        let m = time.split(":")[1];
        let s = time.split(":")[2];
        let suffix = "AM";
        if(h >= 12){
        	h = h==12 ? 12: h%12;
          suffix = "PM";
        }
        time =("0" + h).slice(-2)+":"+m+":"+s+"/"+suffix;
        console.log(date);
        console.log(time);

        【讨论】:

        • 我可以花一点时间来格式化。但我需要一个knex方式。而不是为每个对象再次循环。
        • 实际上在 UI 中显示值之前使用时刻来格式化日期以更正该视图的格式是正确的方法。当将数据作为数据时,ISO8061 使用起来更加方便和安全。
        • 这是没有问题的上下文。
        猜你喜欢
        • 2011-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-17
        • 1970-01-01
        • 2020-06-02
        • 1970-01-01
        相关资源
        最近更新 更多