
/**
 * 数据类型
 *
 */
 export class DataTypes {
    static readonly DataTypes: any = {
        UNKNOWN: 0, //
        BIGINT: 1,
        BINARY: 2,
        BIT: 3,
        CHAR: 4,
        DATETIME: 5,
        DECIMAL: 6,
        FLOAT: 7,
        IMAGE: 8,
        INT: 9,
        MONEY: 10,
        NCHAR: 11,
        NTEXT: 12,
        NVARCHAR: 13,
        NUMERIC: 14,
        REAL: 15,
        SMALLDATETIME: 16,
        SMALLINT: 17,
        SMALLMONEY: 18,
        SQL_VARIANT: 19,
        SYSNAME: 20,
        TEXT: 21,
        TIMESTAMP: 22,
        TINYINT: 23,
        VARBINARY: 24,
        VARCHAR: 25,
        UNIQUEIDENTIFIER: 26,
        DATE: 27, // 纯日期型
        TIME: 28, // 纯时间
        BIGDECIMAL: 29, // 大数值
    }

    /**
     * 是否相等（忽略大小写）
     *
     * @protected
     * @param {string} value
     * @param {string} value2
     * @returns
     * @memberof DataTypes
     */
    protected static equalsIgnoreCase(value: string, value2: string) {
        return value.toLocaleLowerCase() == value2.toLocaleLowerCase();
    }

    /**
     * 字符串转数值
     * 
     * @param strValue
     * @return
     */
    public static fromString(strValue: string): number {
        let result = this.DataTypes[strValue.toUpperCase()];
        return result || this.DataTypes.VARCHAR;
    }

    /**
     * 字符串转数值
     * 
     * @param strValue
     * @return
     */
    public static isNumber(strValue: string): boolean {
        const numberTypes: any[] = ['BIGINT', 'BINARY', 'DECIMAL', 'FLOAT', 'INT', 'MONEY', 'NUMERIC', 'REAL', 'SMALLINT', 'SMALLMONEY', 'TINYINT', 'VARBINARY'];
        if (numberTypes.indexOf(strValue) !== -1) {
            return true;
        } else {
            return false
        }
    }

    /**
     * 获取字符串名称
     * 
     * @param nDataType
     * @return
     */
    public static toString(nDataType: number) {
        let result = 'VARCHAR';
        for (let key in this.DataTypes) {
            if (nDataType == this.DataTypes[key]) {
                result = key;
                break;
            }
        }
        return result;
    }

    /**
     * 是否是日期类型数据
     *
     * @static
     * @param {number} dataType
     * @return {*} 
     * @memberof DataTypes
     */
    public static isDate(dataType: number) {
        const dateTypes: any[] = ['DATETIME', 'SMALLDATETIME', 'DATE', 'TIME'];
        const strValue = this.toString(dataType);
        if (dateTypes.indexOf(strValue) !== -1) {
            return true;
        } else {
            return false
        }
    }

    /**
     * 是否是日期类型数据
     *
     * @static
     * @param {string} dataType
     * @return {*} 
     * @memberof DataTypes
     */
    public static isDate2(type: string) {
        const dateTypes: any[] = ['DATETIME', 'SMALLDATETIME', 'DATE', 'TIME'];
        if (dateTypes.indexOf(type) !== -1) {
            return true;
        } else {
            return false
        }
    }

}
