• 关于 数据库date datetime类型数据类型 的搜索结果

回答

详细解答可以参考官方帮助文档由于 Oracle 和 MySQL 的数据类型并不是一一对应的,所以 DTS 在进行结构迁移时,会根据两种数据库类型的数据类型定义,进行类型映射,下面是数据类型映射关系。 Oracle 数据类型 MySQL 数据类型 DTS 是否支持 varchar2(n [char/byte]) varchar(n) 支持 nvarchar2[(n)] national varchar[(n)] 支持 char[(n [byte/char])] char[(n)] 支持 nchar[(n)]] national char[(n)] 支持 number[(p[,s])] decimal[(p[,s])] 支持 float(p)] double 支持 long longtext 支持 date datetime 支持 binary_float decimal(65,8) 支持 binary_double double 支持 timestamp[(fractional_seconds_precision)] datetime[(fractional_seconds_precision)] 支持 timestamp[(fractional_seconds_precision)]with local time zone datetime[(fractional_seconds_precision)] 支持 timestamp[(fractional_seconds_precision)]with local time zone datetime[(fractional_seconds_precision)] 支持 clob longtext 支持 nclob longtext 支持 blob longblob 支持 raw varbinary(2000) 支持 long raw longblob 支持 bfile — 不支持 interval year(year_precision) to mongth — 不支持 interval day(day_precision) to second[(fractional_seconds_precision)] — 不支持 对于 char 类型,当 char(n) 的定义长度 n 超过 255 时,DTS 会自动将类型转换为 varchar(n)。由于 MySQL 本身不支持类似 Oracle 中的 bfile、interval year to month、interval day to second 这三种数据类型,所以 DTS 在进行结构迁移时,无法在 MySQL 中找到合适的数据类型进行映射,因此这三种类型不会进行转化。迁移时如果表中含有这三种类型,会导致结构迁移失败,用户可以在指定迁移对象的时候,对需要迁移的对象中这三种类型的列进行排除。由于 MySQL 的 timestamp 类型不包含时区,而 Oracle 的 timestamp with time zone 和 timestamp with local time zone 两种类型默认带有时区信息,所以 DTS 在迁移这两种类型的数据时,会将其转换成 UTC 时区后存入目标 RDS for MySQL 实例。

2019-12-01 23:09:40 0 浏览量 回答数 0

问题

OSC的POJO类在处理时间属性是如何操作的?

落地花开啦 2019-12-01 19:48:54 1102 浏览量 回答数 1

回答

详细解答可以参考官方帮助文档使用 数据传输服务 DTS 可以将本地的 Oracle 数据库中的数据迁移至 RDS for MySQL 实例。数据传输 DTS (以下简称 DTS)可以实现结构迁移、全量数据迁移以及增量数据迁移。通过三种迁移方式的结合,可以在保持源 Oracle 数据库实例正常对外提供服务的情况下,实现 Oracle 数据库的不停服迁移。 注:当前 DTS 已经可以支持将本地的 Oracle 数据库中的数据迁移至 RDS for MySQL 实例时,数据的反向回流,帮助用户在应用按模块切换过程中,将 RDS for MySQL 实例中产生的数据变化同步回本地的 Oracle 数据库。如有需求,请提交工单咨询开通。 本小节简单介绍使用 DTS 进行 Oracle->RDS for MySQL 数据迁移的任务配置流程。 迁移步骤对于 Oracle->RDS for MySQL 的迁移,支持结构迁移、全量数据迁移以及增量数据迁移。各迁移类型的限制如下: 结构迁移DTS 会将迁移对象的结构定义迁移到目标实例。目前 DTS 支持结构迁移的对象包括:表。其他对象如视图、同义词、触发器、存储过程、存储函数、包、自定义类型等暂不支持。 全量数据迁移DTS 会将源数据库迁移对象的存量数据全部迁移到目标 RDS for MySQL 实例。如果仅做全量数据迁移,不做增量数据迁移,迁移过程中,如果源 Oracle 数据库有数据更新的话,那么这部分数据增量变化不一定能够被迁移到目标 RDS for MySQL 中。所以,如果仅做全量数据迁移,不做增量数据迁移,为保证迁移数据一致性,在数据迁移过程中,源端的 Oracle 实例需停止写入。 增量数据迁移增量迁移过程中,DTS 会轮询并捕获源 Oracle 实例由于数据变化产生的重做日志 redo log,然后将数据变化的增量实时同步到目标 RDS for MySQL 实例,通过增量数据迁移可以实现目标 RDS for MySQL 实例同源 Oracle 数据库实例的实时数据同步。 迁移权限要求 当使用 DTS 进行 Oracle->RDS for MySQL 迁移时,在不同迁移类型情况下,对源和目标数据库的迁移帐号权限要求如下: 迁移类型 结构迁移 全量迁移 增量数据迁移 本地 Oracle 实例 schema 的 owner schema 的 owner SYSDBA 目的 RDS for MySQL 实例 待迁入 db 的读写权限 待迁入 db 的读写权限 待迁入 db 的读写权限 迁移前置条件 待迁移 Oracle 数据库的版本为 10g,11g,12c。Oracle 数据库实例开启 supplemental log,且要求 supplemental_log_data_pk,supplemental_log_data_ui 开启。Oracle 数据库实例要求开启 archive log 归档模式,保证归档日志能够被访问并有一定的保存周期。 数据类型映射关系由于 Oracle 和 MySQL 的数据类型并不是一一对应的,所以 DTS 在进行结构迁移时,会根据两种数据库类型的数据类型定义,进行类型映射,下面是数据类型映射关系。 Oracle 数据类型 MySQL 数据类型 DTS 是否支持 varchar2(n [char/byte]) varchar(n) 支持 nvarchar2[(n)] national varchar[(n)] 支持 char[(n [byte/char])] char[(n)] 支持 nchar[(n)]] national char[(n)] 支持 number[(p[,s])] decimal[(p[,s])] 支持 float(p)] double 支持 long longtext 支持 date datetime 支持 binary_float decimal(65,8) 支持 binary_double double 支持 timestamp[(fractional_seconds_precision)] datetime[(fractional_seconds_precision)] 支持 timestamp[(fractional_seconds_precision)]with local time zone datetime[(fractional_seconds_precision)] 支持 timestamp[(fractional_seconds_precision)]with local time zone datetime[(fractional_seconds_precision)] 支持 clob longtext 支持 nclob longtext 支持 blob longblob 支持 raw varbinary(2000) 支持 long raw longblob 支持 bfile — 不支持 interval year(year_precision) to mongth — 不支持 interval day(day_precision) to second[(fractional_seconds_precision)] — 不支持 对于 char 类型,当 char(n) 的定义长度 n 超过 255 时,DTS 会自动将类型转换为 varchar(n)。由于 MySQL 本身不支持类似 Oracle 中的 bfile、interval year to month、interval day to second 这三种数据类型,所以 DTS 在进行结构迁移时,无法在 MySQL 中找到合适的数据类型进行映射,因此这三种类型不会进行转化。迁移时如果表中含有这三种类型,会导致结构迁移失败,用户可以在指定迁移对象的时候,对需要迁移的对象中这三种类型的列进行排除。由于 MySQL 的 timestamp 类型不包含时区,而 Oracle 的 timestamp with time zone 和 timestamp with local time zone 两种类型默认带有时区信息,所以 DTS 在迁移这两种类型的数据时,会将其转换成 UTC 时区后存入目标 RDS for MySQL 实例。 迁移步骤下面详细介绍下使用 DTS 将本地 Oracle 数据库中的数据迁移到 RDS for MySQL 实例的任务配置流程。 创建 RDS for MySQL 实例在数据迁移过程中,如果待迁移的数据库在目标 RDS for MySQL 实例中不存在,那么 DTS 会自动创建。但是对于如下两种情况,用户需要在配置迁移任务之前,手动创建数据库。 数据库名称不符合 RDS 定义规范(由小写字母、数字、下划线、中划线组成,字母开头,字母或数字结尾,最长 64 个字符)。待迁移数据库,在源 Oracle 与目标 RDS for MySQL 实例中名称不同。 对于这两种情况,用户需要在配置迁移任务之前,先在 RDS 控制台完成数据库创建。具体参考 RDS 数据库创建流程 RDS 使用手册。 创建迁移帐号迁移任务配置,需要提供 Oracle 数据库及目标 RDS 实例的迁移账号。迁移账号所需权限详见上文的 迁移权限要求。 如果您的源 Oracle 实例的迁移账号尚未创建,那么您可以参考 Oracle Grant 语法说明,创建满足要求的迁移账号。 RDS for MySQL 迁移账号的创建及授权操作详见 RDS 使用手册。 迁移任务配置当上面的所有前置条件都配置完成后,就可以开始迁移任务配置。下面详细介绍下具体的迁移步骤。 进入数据传输服务 DTS 控制台,单击右上角的创建迁移任务,正式开始任务配置。本地 Oracle 数据库实例及目标 RDS for MySQL 实例的连接信息配置。 这个步骤主要配置迁移任务名称,Oracle 数据库实例连接信息及目标 RDS for MySQL 实例连接信息。其中: 任务名称 DTS 为每个任务自动生成一个任务名称,任务名称没有唯一性要求。您可以根据需要修改任务名称,建议为任务配置具有业务意义的名称,便于后续的任务识别。 源实例信息 实例类型:选择 有公网 IP 的自建数据库数据库类型: 选择 Oracle主机名或IP地址: 配置 Oracle 访问地址,这个地址必须为公网访问方式端口:Oracle 数据库实例的监听端口SID:Oracle 数据库实例的 SID账号:Oracle 数据库实例的连接账号密码:上面指定的 Oracle 数据库实例的连接账号对应的密码 目标实例信息 实例类型:选择 RDS 实例RDS 实例 ID: 配置迁移的目标 RDS for MySQL 实例的实例 ID。 DTS 支持经典网络和 VPC 网络的 RDS实例账号:RDS for MySQL 实例的连接账号密码:上面指定的 RDS for MySQL 实例连接账号对应的密码 当配置完连接信息后,单击右下角 授权白名单并进入下一步 进行白名单授权。这个步骤 DTS 会将 DTS 服务器的 IP 地址添加到目标 RDS for MySQL 实例的白名单中,避免因为 RDS 实例设置了白名单,导致 DTS 服务器连接不上 RDS for MySQL 实例导致迁移失败。 迁移对象及迁移类型配置。 迁移类型包括:结构迁移、全量数据迁移、增量数据迁移。默认选择 结构迁移+全量数据迁移。 迁移对象,需要选择您要迁移的对象。迁移对象选择的粒度可以为:库、表、列三个粒度。 默认情况下,对象迁移到 RDS for MySQL 实例后,对象名与源 Oracle 数据库中一致。如果您迁移的对象在源实例与目标实例上名称不同,那么需要使用 DTS 提供的对象名映射功能,详细使用方式可以参考 库表列映射。 当配置完迁移对象及迁移类型后,即进入任务启动前的预检查步骤。 任务预检查。 在迁移任务正式启动之前,会先进行前置预检查,只有预检查通过后,才能成功启动迁移。 如果预检查失败,那么可以点击具体检查项后的按钮,查看具体的失败详情,并根据失败原因修复后,重新进行预检查。 启动迁移任务。 当预检查通过后,我们可以启动迁移任务,任务启动后,可以到任务列表中查看任务具体的迁移状态及进度。 当任务进入增量数据迁移阶段,任务不会自动停止,且一旦源 Oracle 数据库实例有增量写入,增量数据就会自动同步到目标 RDS for MySQL 实例。增量数据迁移是个动态同步的过程,建议在增量迁移达到无延迟状态时,在目标数据库上进行业务验证。如果验证成功,那么可以停掉迁移任务,将业务切换到目标数据库。 至此,完成将本地 Oracle 数据库到 RDS for MySQL 实例的数据迁移任务配置。

2019-12-01 23:09:40 0 浏览量 回答数 0

海外云虚拟主机包年25元/月起

海外独享虚拟主机全面上线,助力构建海外网站,提升公司国际形象;全球有效覆盖,超高性价比;建站入门首选,助力出口,适合跨境贸易企业。

回答

详细解答可以参考官方帮助文档使用 数据传输服务 DTS 可以将本地的 Oracle 数据库中的数据迁移至 RDS for MySQL 实例。数据传输 DTS (以下简称 DTS)可以实现结构迁移、全量数据迁移以及增量数据迁移。通过三种迁移方式的结合,可以在保持源 Oracle 数据库实例正常对外提供服务的情况下,实现 Oracle 数据库的不停服迁移。 注:当前 DTS 已经可以支持将本地的 Oracle 数据库中的数据迁移至 RDS for MySQL 实例时,数据的反向回流,帮助用户在应用按模块切换过程中,将 RDS for MySQL 实例中产生的数据变化同步回本地的 Oracle 数据库。如有需求,请提交工单咨询开通。 本小节简单介绍使用 DTS 进行 Oracle->RDS for MySQL 数据迁移的任务配置流程。 迁移步骤对于 Oracle->RDS for MySQL 的迁移,支持结构迁移、全量数据迁移以及增量数据迁移。各迁移类型的限制如下: 结构迁移DTS 会将迁移对象的结构定义迁移到目标实例。目前 DTS 支持结构迁移的对象包括:表。其他对象如视图、同义词、触发器、存储过程、存储函数、包、自定义类型等暂不支持。 全量数据迁移DTS 会将源数据库迁移对象的存量数据全部迁移到目标 RDS for MySQL 实例。如果仅做全量数据迁移,不做增量数据迁移,迁移过程中,如果源 Oracle 数据库有数据更新的话,那么这部分数据增量变化不一定能够被迁移到目标 RDS for MySQL 中。所以,如果仅做全量数据迁移,不做增量数据迁移,为保证迁移数据一致性,在数据迁移过程中,源端的 Oracle 实例需停止写入。 增量数据迁移增量迁移过程中,DTS 会轮询并捕获源 Oracle 实例由于数据变化产生的重做日志 redo log,然后将数据变化的增量实时同步到目标 RDS for MySQL 实例,通过增量数据迁移可以实现目标 RDS for MySQL 实例同源 Oracle 数据库实例的实时数据同步。 迁移权限要求 当使用 DTS 进行 Oracle->RDS for MySQL 迁移时,在不同迁移类型情况下,对源和目标数据库的迁移帐号权限要求如下: 迁移类型 结构迁移 全量迁移 增量数据迁移 本地 Oracle 实例 schema 的 owner schema 的 owner SYSDBA 目的 RDS for MySQL 实例 待迁入 db 的读写权限 待迁入 db 的读写权限 待迁入 db 的读写权限 迁移前置条件 待迁移 Oracle 数据库的版本为 10g,11g,12c。Oracle 数据库实例开启 supplemental log,且要求 supplemental_log_data_pk,supplemental_log_data_ui 开启。Oracle 数据库实例要求开启 archive log 归档模式,保证归档日志能够被访问并有一定的保存周期。 数据类型映射关系由于 Oracle 和 MySQL 的数据类型并不是一一对应的,所以 DTS 在进行结构迁移时,会根据两种数据库类型的数据类型定义,进行类型映射,下面是数据类型映射关系。 Oracle 数据类型 MySQL 数据类型 DTS 是否支持 varchar2(n [char/byte]) varchar(n) 支持 nvarchar2[(n)] national varchar[(n)] 支持 char[(n [byte/char])] char[(n)] 支持 nchar[(n)]] national char[(n)] 支持 number[(p[,s])] decimal[(p[,s])] 支持 float(p)] double 支持 long longtext 支持 date datetime 支持 binary_float decimal(65,8) 支持 binary_double double 支持 timestamp[(fractional_seconds_precision)] datetime[(fractional_seconds_precision)] 支持 timestamp[(fractional_seconds_precision)]with local time zone datetime[(fractional_seconds_precision)] 支持 timestamp[(fractional_seconds_precision)]with local time zone datetime[(fractional_seconds_precision)] 支持 clob longtext 支持 nclob longtext 支持 blob longblob 支持 raw varbinary(2000) 支持 long raw longblob 支持 bfile — 不支持 interval year(year_precision) to mongth — 不支持 interval day(day_precision) to second[(fractional_seconds_precision)] — 不支持 对于 char 类型,当 char(n) 的定义长度 n 超过 255 时,DTS 会自动将类型转换为 varchar(n)。由于 MySQL 本身不支持类似 Oracle 中的 bfile、interval year to month、interval day to second 这三种数据类型,所以 DTS 在进行结构迁移时,无法在 MySQL 中找到合适的数据类型进行映射,因此这三种类型不会进行转化。迁移时如果表中含有这三种类型,会导致结构迁移失败,用户可以在指定迁移对象的时候,对需要迁移的对象中这三种类型的列进行排除。由于 MySQL 的 timestamp 类型不包含时区,而 Oracle 的 timestamp with time zone 和 timestamp with local time zone 两种类型默认带有时区信息,所以 DTS 在迁移这两种类型的数据时,会将其转换成 UTC 时区后存入目标 RDS for MySQL 实例。 迁移步骤下面详细介绍下使用 DTS 将本地 Oracle 数据库中的数据迁移到 RDS for MySQL 实例的任务配置流程。 创建 RDS for MySQL 实例在数据迁移过程中,如果待迁移的数据库在目标 RDS for MySQL 实例中不存在,那么 DTS 会自动创建。但是对于如下两种情况,用户需要在配置迁移任务之前,手动创建数据库。 数据库名称不符合 RDS 定义规范(由小写字母、数字、下划线、中划线组成,字母开头,字母或数字结尾,最长 64 个字符)。待迁移数据库,在源 Oracle 与目标 RDS for MySQL 实例中名称不同。 对于这两种情况,用户需要在配置迁移任务之前,先在 RDS 控制台完成数据库创建。具体参考 RDS 数据库创建流程 RDS 使用手册。 创建迁移帐号迁移任务配置,需要提供 Oracle 数据库及目标 RDS 实例的迁移账号。迁移账号所需权限详见上文的 迁移权限要求。 如果您的源 Oracle 实例的迁移账号尚未创建,那么您可以参考 Oracle Grant 语法说明,创建满足要求的迁移账号。 RDS for MySQL 迁移账号的创建及授权操作详见 RDS 使用手册。 迁移任务配置当上面的所有前置条件都配置完成后,就可以开始迁移任务配置。下面详细介绍下具体的迁移步骤。 进入数据传输服务 DTS 控制台,单击右上角的创建迁移任务,正式开始任务配置。本地 Oracle 数据库实例及目标 RDS for MySQL 实例的连接信息配置。 这个步骤主要配置迁移任务名称,Oracle 数据库实例连接信息及目标 RDS for MySQL 实例连接信息。其中: 任务名称 DTS 为每个任务自动生成一个任务名称,任务名称没有唯一性要求。您可以根据需要修改任务名称,建议为任务配置具有业务意义的名称,便于后续的任务识别。 源实例信息 实例类型:选择 有公网 IP 的自建数据库数据库类型: 选择 Oracle主机名或IP地址: 配置 Oracle 访问地址,这个地址必须为公网访问方式端口:Oracle 数据库实例的监听端口SID:Oracle 数据库实例的 SID账号:Oracle 数据库实例的连接账号密码:上面指定的 Oracle 数据库实例的连接账号对应的密码 目标实例信息 实例类型:选择 RDS 实例RDS 实例 ID: 配置迁移的目标 RDS for MySQL 实例的实例 ID。 DTS 支持经典网络和 VPC 网络的 RDS实例账号:RDS for MySQL 实例的连接账号密码:上面指定的 RDS for MySQL 实例连接账号对应的密码 当配置完连接信息后,单击右下角 授权白名单并进入下一步 进行白名单授权。这个步骤 DTS 会将 DTS 服务器的 IP 地址添加到目标 RDS for MySQL 实例的白名单中,避免因为 RDS 实例设置了白名单,导致 DTS 服务器连接不上 RDS for MySQL 实例导致迁移失败。 迁移对象及迁移类型配置。 迁移类型包括:结构迁移、全量数据迁移、增量数据迁移。默认选择 结构迁移+全量数据迁移。 迁移对象,需要选择您要迁移的对象。迁移对象选择的粒度可以为:库、表、列三个粒度。 默认情况下,对象迁移到 RDS for MySQL 实例后,对象名与源 Oracle 数据库中一致。如果您迁移的对象在源实例与目标实例上名称不同,那么需要使用 DTS 提供的对象名映射功能,详细使用方式可以参考 库表列映射。 当配置完迁移对象及迁移类型后,即进入任务启动前的预检查步骤。 任务预检查。 在迁移任务正式启动之前,会先进行前置预检查,只有预检查通过后,才能成功启动迁移。 如果预检查失败,那么可以点击具体检查项后的按钮,查看具体的失败详情,并根据失败原因修复后,重新进行预检查。 启动迁移任务。 当预检查通过后,我们可以启动迁移任务,任务启动后,可以到任务列表中查看任务具体的迁移状态及进度。 当任务进入增量数据迁移阶段,任务不会自动停止,且一旦源 Oracle 数据库实例有增量写入,增量数据就会自动同步到目标 RDS for MySQL 实例。增量数据迁移是个动态同步的过程,建议在增量迁移达到无延迟状态时,在目标数据库上进行业务验证。如果验证成功,那么可以停掉迁移任务,将业务切换到目标数据库。 至此,完成将本地 Oracle 数据库到 RDS for MySQL 实例的数据迁移任务配置。

2019-12-01 23:09:40 0 浏览量 回答数 0

问题

MaxCompute用户指南:SQL:类型转换

行者武松 2019-12-01 22:02:12 1478 浏览量 回答数 0

问题

jfinal使用getModule方法,提示Unparseable date: ?报错

爱吃鱼的程序员 2020-06-09 15:38:52 0 浏览量 回答数 1

回答

可以用CONVERT()来对日期时间值进行转换后再输出。 如:convert(varchar(10), getdate(), 111) 可以查看convert()的相关文档以了解其详细用法###### 表达有误,修正一下:   定义的数据类型: date 添加到数据库中的数据内容: 2010-11-7 数据库表中date列中的数据: 2010-11-7 列中的数据是不带  0:00:00  的. 但C#读取出来的显示的内容是: 2010/11/7 0:00:00 读取语句(页面中代码): <%#DataBinder.Eval(Container.DataItem,"date") %> .cs文件代码:   if (dr.HasRows)             {                 this.txtDate.Text = dr.GetValue(3).ToString();      }  ###### 日期的显示,最好是单独进行格式化处理,例如 Java 中的 DateFormat ,这样不管数据库是什么类型,应用显示上都是一致的。###### 问题已解决. 两种方法: 1.this.labMsg.Text = dr.GetDateTime(3).ToShortDateString(); GetDateTime(): 获取指定列的System.DateTime对象形式的值. ToShortDateString(): 将此实例的值转换为其等效的短日期字符串表示形式. 2.this.labMsg.Text = dr.GetValue(3).ToString().Substring(0,10); GetValue(): 获取以本机格式表示的指定列的值. Substring(Int32, Int32): 从此实例检索子字符串。子字符串从指定的字符位置开始且具有指定的长度。 其实标题写错了,这个是代码本身的问题,并不是数据库的问题,在mssql2008中,设置为date类型的数据其本身格式就是: 2010-11-07. 是我用错了方法,GetValue()获取到的方法是以本机格式表示的,自然就成了2010/11/1 0:00:00这个的格式了,换成GetDateTime()然后将其转换是短时期字符串ToShortDateString()就可以了. 谢谢各位热心的朋友

kun坤 2020-06-07 20:31:08 0 浏览量 回答数 0

问题

关于mysql5.6以上版本时间data类型插入出错解决方案

蛮大人123 2019-12-01 19:48:24 1128 浏览量 回答数 1

回答

    最简单的办法是将表字段类型改成 datetime,而不要使用 timestamp。datetime已经将时间精确到秒的级别了,一般是够用了。    如果应用比较特殊非要保存毫秒精度,一是页面传过来的日期按照格式来:yyyy-mm-dd hh:mm:ss[.fffffffff],如果不按格式来,可以将表单域的name改为另外的名,如xyz,然后 getModel()完事后,再 model.set(name, TimestampKit.toTimestamp(getPara("xyz"))自行转换后再 set 一下即可 ######回复 @jockiller : 感谢支持 jfinal 发展 ^_^######回复 @JFinal : 十分感谢 我再研究一下..祝愿jfinal越来越好######回复 @jockiller : 只需认准java类型为Date,然后找一个合适的oracle字段类型在JDBC规范下对应java 的Date就可以,我记得oracel的DATE 类型是可以对应上的,只不过貌似要设置合适的长度######回复 @jockiller : jfinal 有关java类型与数据库字段类型的互转,完全依赖于JDBC给出的类型,可以看一下 com.jfinal.plugin.activerecrod.TableBuilder中是通过jdbc反射得到的数据表字段对应的java类型。在转换的时候也按照了这个标准来进行######而且 还有一个地方 不是很理解..我的oracle数据库中这个字段是date类型,不是timestamp类型..但是 刚才打打断点clazz却是timestamp,这是为啥?######直接getStr过来自己转一下嘛######那样的话 getModule方法就没用了..######    这里有个更详细的贴子,建议看一下:http://www.oschina.net/question/586193_241111###### getmodel取其他的数据。针对这个一个字段特殊处理。 没必要和自己较劲。 ######谢谢回答..不过最后通过下面这种方法解决的..###### 引用来自“JFinal”的评论     最简单的办法是将表字段类型改成 datetime,而不要使用 timestamp。datetime已经将时间精确到秒的级别了,一般是够用了。    如果应用比较特殊非要保存毫秒精度,一是页面传过来的日期按照格式来: yyyy-mm-dd hh:mm:ss[.fffffffff],如果不按格式来,可以将表单域的name改为另外的名,如xyz,然后 getModel()完事后,再 model.set(name, TimestampKit.toTimestamp(getPara("xyz"))自行转换后再 set 一下即可 最后通过改写源码的方式解决的 else if (clazz == java.sql.Timestamp.class) { String value = s.trim().replaceAll("/", "-"); if(s.matches("^\\d{4}$")){ value=s+"-01-01 00:00:00"; }else if(s.matches("^\\d{4}-\\d{1,2}$")){ value=s+"-01 00:00:00"; }else if(s.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")){ value=s+" 00:00:00"; }else if(s.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}")){ value=s+":00:00"; }else if(s.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")){ value=s+":00"; }else if(s.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")){ value=s; }else { throw new RuntimeException("timestamp pattern is not find.."); } result = java.sql.Timestamp.valueOf(value); } 希望JFinal越来越好!! ######已经做过备忘,jfinal 2.1 会让 Timestamp 支持 yyyy-mm-dd 格式的数据######@JFinal : 老大 最后通过这种方式解决的

kun坤 2020-05-29 11:49:42 0 浏览量 回答数 0

问题

YYYYDD_OPT如何使用

猫饭先生 2019-12-01 21:20:23 942 浏览量 回答数 0

问题

YYYYWEEK_OPT如何使用

猫饭先生 2019-12-01 21:20:22 799 浏览量 回答数 0

问题

YYYYMM_OPT如何使用

猫饭先生 2019-12-01 21:20:21 1099 浏览量 回答数 0

回答

在Java方面,日期通常由(设计欠佳,但不包括在内)表示java.util.Date。它基本上是由支持大纪元时间中的味道long,也称为时间戳。它包含有关日期和时间部分的信息。在Java中,精度以毫秒为单位。 在SQL方面,有几个标准的日期和时间类型,DATE,TIME和TIMESTAMP(在一些DB也叫DATETIME),这是代表在JDBC为java.sql.Date,java.sql.Time和java.sql.Timestamp所有子类的java.util.Date。精度取决于数据库,通常像Java一样以毫秒为单位,但是也可以以秒为单位。 与相反java.util.Date,java.sql.Date仅包含有关日期部分(年,月,日)的信息。像一样,Time仅包含有关时间部分(小时,分钟,秒)的Timestamp信息,并且包含有关两个部分的信息java.util.Date。 在数据库(因此,java.util.Date在Java端和java.sql.TimestampJDBC端)中存储时间戳的通常做法是使用PreparedStatement#setTimestamp()。 java.util.Date date = getItSomehow(); Timestamp timestamp = new Timestamp(date.getTime()); preparedStatement = connection.prepareStatement("SELECT * FROM tbl WHERE ts > ?"); preparedStatement.setTimestamp(1, timestamp); 从DB获得时间戳的正常做法是使用ResultSet#getTimestamp()。 Timestamp timestamp = resultSet.getTimestamp("ts"); java.util.Date date = timestamp; // You can just upcast.来源:stack overflow

保持可爱mmm 2020-05-11 12:00:17 0 浏览量 回答数 0

问题

PHP MySQL 创建数据库和表

ethnicity 2019-12-01 22:08:21 8427 浏览量 回答数 0

问题

SQL 兼容性怎么样?

猫饭先生 2019-12-01 21:19:24 905 浏览量 回答数 0

问题

beetlsql SQL 模板参数日期格式化无效:配置报错 

kun坤 2020-06-02 18:03:39 0 浏览量 回答数 1

问题

beetlsql SQL 模板参数日期格式化无效 :报错

kun坤 2020-06-20 11:41:49 1 浏览量 回答数 1

问题

云数据库OceanBase的时间日期类型

云栖大讲堂 2019-12-01 21:28:35 1513 浏览量 回答数 0

问题

beetlsql SQL 模板参数日期格式化无效-配置报错

montos 2020-06-02 13:13:01 0 浏览量 回答数 1

问题

python使用redis 神器 ---redisco Model Attributes,py报错

python小菜菜 2020-05-27 15:25:31 4 浏览量 回答数 1

问题

python使用redis 神器 ---redisco Model Attributes:报错

kun坤 2020-06-06 14:28:05 0 浏览量 回答数 1

问题

YYYYMM如何使用

猫饭先生 2019-12-01 21:20:20 1157 浏览量 回答数 0

问题

MySQL 数据类型,数据库报错

python小菜菜 2020-06-01 16:05:21 1 浏览量 回答数 1

问题

YYYYDD如何使用

猫饭先生 2019-12-01 21:20:21 1064 浏览量 回答数 0

问题

YYYYWEEK如何使用

猫饭先生 2019-12-01 21:20:20 977 浏览量 回答数 0

问题

Firebase DatabaseException无法将java.lang.Long类型的值转换为

LiuWH 2020-01-07 13:56:24 1 浏览量 回答数 1

问题

如何使用CREATE TABLE数据定义语言

云栖大讲堂 2019-12-01 21:28:42 1357 浏览量 回答数 0

回答

平常工作的时候有时候会遇到美国时间,美国时间含有"T","Z","+"等特殊字符,比如 yyyy-MM-dd'T'HH:mm:ss'Z'或者yyyy-MM-dd'T'HH:mm:ss'+'00:00,而我们数据库保存的时间大部分是date或者dateTime类型直接保存会报错,这个时候就需要我们转换一下。 比如 2016-09-15T18:24:38+00:00 这种格式的。 新建一个Util public static Date ToDate(String dateString) { if(dateString==null||"".equals(dateString)){ return null; } Date returnDate=null; //2016-09-15T18:24:38+00:00 String[] ds=new String[]{"yyyy-MM-dd'T'HH:mm:ss'Z'","yyyy-MM-dd'T'HH:mm:ss'+'00:00"}; for(String d:ds){ try{ returnDate= new java.text.SimpleDateFormat(d).parse(dateString); }catch(Exception e){ continue; } //System.out.println("ToDate(parse):\nBefore->"+dateString+"\nAfter->"+DateUtil.getDateTimeString1(returnDate)); return returnDate; } try{ XMLGregorianCalendar cal=XMLGregorianCalendarImpl.parse(dateString); GregorianCalendar gc=cal.toGregorianCalendar(); gc.setTimeZone(TimeZone.getTimeZone("UTC")); returnDate= gc.getTime(); //System.out.println("ToDate(getTime):\nBefore->"+dateString+"\nAfter->"+DateUtil.getDateTimeString1(returnDate)); return returnDate; }catch(Exception e1){ return null; } } }

问问小秘 2020-04-30 16:49:17 0 浏览量 回答数 0

问题

pyodbc-传递参数

is大龙 2020-03-24 23:38:21 0 浏览量 回答数 1

回答

*1、查询SQL尽量不要使用select ,而是select具体字段。 反例子: select * from employee; 正例子: select id,name from employee; 理由: 只取需要的字段,节省资源、减少网络开销。select * 进行查询时,很可能就不会使用到覆盖索引了,就会造成回表查询。 2、如果知道查询结果只有一条或者只要最大/最小一条记录,建议用limit 1 假设现在有employee员工表,要找出一个名字叫jay的人. CREATE TABLE `employee` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL, `date` datetime DEFAULT NULL, `sex` int(1) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 反例: select id,name from employee where name='jay' 正例 select id,name from employee where name='jay' limit 1; 理由: 加上limit 1后,只要找到了对应的一条记录,就不会继续向下扫描了,效率将会大大提高。当然,如果name是唯一索引的话,是不必要加上limit 1了,因为limit的存在主要就是为了防止全表扫描,从而提高性能,如果一个语句本身可以预知不用全表扫描,有没有limit ,性能的差别并不大。 3、应尽量避免在where子句中使用or来连接条件 新建一个user表,它有一个普通索引userId,表结构如下: CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `userId` int(11) NOT NULL, `age` int(11) NOT NULL, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `idx_userId` (`userId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 假设现在需要查询userid为1或者年龄为18岁的用户,很容易有以下sql 反例: select * from user where userid=1 or age =18 正例: //使用union all select * from user where userid=1 union all select * from user where age = 18 //或者分开两条sql写: select * from user where userid=1 select * from user where age = 18 理由: 使用or可能会使索引失效,从而全表扫描。 对于or+没有索引的age这种情况,假设它走了userId的索引,但是走到age查询条件时,它还得全表扫描,也就是需要三步过程: 全表扫描+索引扫描+合并 如果它一开始就走全表扫描,直接一遍扫描就完事。 mysql是有优化器的,处于效率与成本考虑,遇到or条件,索引可能失效,看起来也合情合理。 4、优化limit分页 我们日常做分页需求时,一般会用 limit 实现,但是当偏移量特别大的时候,查询效率就变得低下。 反例: select id,name,age from employee limit 10000,10 正例: //方案一 :返回上次查询的最大记录(偏移量) select id,name from employee where id>10000 limit 10. //方案二:order by + 索引 select id,name from employee order by id limit 10000,10 //方案三:在业务允许的情况下限制页数: 理由: 当偏移量最大的时候,查询效率就会越低,因为Mysql并非是跳过偏移量直接去取后面的数据,而是先把偏移量+要取的条数,然后再把前面偏移量这一段的数据抛弃掉再返回的。 如果使用优化方案一,返回上次最大查询记录(偏移量),这样可以跳过偏移量,效率提升不少。 方案二使用order by+索引,也是可以提高查询效率的。 方案三的话,建议跟业务讨论,有没有必要查这么后的分页啦。因为绝大多数用户都不会往后翻太多页。 5、优化你的like语句 日常开发中,如果用到模糊关键字查询,很容易想到like,但是like很可能让你的索引失效。 反例: select userId,name from user where userId like '%123'; 正例: select userId,name from user where userId like '123%'; 理由: 把%放前面,并不走索引,如下: 把% 放关键字后面,还是会走索引的。如下: 6、使用where条件限定要查询的数据,避免返回多余的行 假设业务场景是这样:查询某个用户是否是会员。曾经看过老的实现代码是这样。。。 反例: List<Long> userIds = sqlMap.queryList("select userId from user where isVip=1"); boolean isVip = userIds.contains(userId); 正例: Long userId = sqlMap.queryObject("select userId from user where userId='userId' and isVip='1' ") boolean isVip = userId!=null; 理由: 需要什么数据,就去查什么数据,避免返回不必要的数据,节省开销。 7、尽量避免在索引列上使用mysql的内置函数 业务需求:查询最近七天内登陆过的用户(假设loginTime加了索引) 反例: select userId,loginTime from loginuser where Date_ADD(loginTime,Interval 7 DAY) >=now(); 正例: explain select userId,loginTime from loginuser where loginTime >= Date_ADD(NOW(),INTERVAL - 7 DAY); 理由: 索引列上使用mysql的内置函数,索引失效 8、应尽量避免在 where 子句中对字段进行表达式操作,这将导致系统放弃使用索引而进行全表扫 反例: select * from user where age-1 =10; 正例: select * from user where age =11; 理由: 9、Inner join 、left join、right join,优先使用Inner join,如果是left join,左边表结果尽量小 Inner join 内连接,在两张表进行连接查询时,只保留两张表中完全匹配的结果集 left join 在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录。 right join 在两张表进行连接查询时,会返回右表所有的行,即使在左表中没有匹配的记录。 都满足SQL需求的前提下,推荐优先使用Inner join(内连接),如果要使用left join,左边表数据结果尽量小,如果有条件的尽量放到左边处理。 反例: select * from tab1 t1 left join tab2 t2 on t1.size = t2.size where t1.id>2; 正例: select * from (select * from tab1 where id >2) t1 left join tab2 t2 on t1.size = t2.size; 理由: 如果inner join是等值连接,或许返回的行数比较少,所以性能相对会好一点。 同理,使用了左连接,左边表数据结果尽量小,条件尽量放到左边处理,意味着返回的行数可能比较少。 10、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 反例: select age,name from user where age <>18; 正例: //可以考虑分开两条sql写 select age,name from user where age <18; select age,name from user where age >18; 理由: 使用!=和<>很可能会让索引失效 11、使用联合索引时,注意索引列的顺序,一般遵循最左匹配原则。 表结构:(有一个联合索引idx_userid_age,userId在前,age在后) CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `userId` int(11) NOT NULL, `age` int(11) DEFAULT NULL, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `idx_userid_age` (`userId`,`age`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 反例: select * from user where age = 10; 正例: //符合最左匹配原则 select * from user where userid=10 and age =10; //符合最左匹配原则 select * from user where userid =10; 理由: 当我们创建一个联合索引的时候,如(k1,k2,k3),相当于创建了(k1)、(k1,k2)和(k1,k2,k3)三个索引,这就是最左匹配原则。 联合索引不满足最左原则,索引一般会失效,但是这个还跟Mysql优化器有关的。 12、对查询进行优化,应考虑在 where 及 order by 涉及的列上建立索引,尽量避免全表扫描。 反例: select * from user where address ='深圳' order by age ; 正例: 添加索引 alter table user add index idx_address_age (address,age) 13、如果插入数据过多,考虑批量插入。 反例: for(User u :list){ INSERT into user(name,age) values(#name#,#age#) } 正例: //一次500批量插入,分批进行 insert into user(name,age) values <foreach collection="list" item="item" index="index" separator=","> (#{item.name},#{item.age}) </foreach> 理由: 批量插入性能好,更加省时间 打个比喻:假如你需要搬一万块砖到楼顶,你有一个电梯,电梯一次可以放适量的砖(最多放500),你可以选择一次运送一块砖,也可以一次运送500,你觉得哪个时间消耗大? 14、在适当的时候,使用覆盖索引。 覆盖索引能够使得你的SQL语句不需要回表,仅仅访问索引就能够得到所有需要的数据,大大提高了查询效率。 反例: // like模糊查询,不走索引了 select * from user where userid like '%123%' 正例: //id为主键,那么为普通索引,即覆盖索引登场了。 select id,name from user where userid like '%123%'; 15、慎用distinct关键字 distinct 关键字一般用来过滤重复记录,以返回不重复的记录。在查询一个字段或者很少字段的情况下使用时,给查询带来优化效果。但是在字段很多的时候使用,却会大大降低查询效率。 反例: SELECT DISTINCT * from user; 正例: select DISTINCT name from user; 理由: 带distinct的语句cpu时间和占用时间都高于不带distinct的语句。因为当查询很多字段时,如果使用distinct,数据库引擎就会对数据进行比较,过滤掉重复数据,然而这个比较,过滤的过程会占用系统资源,cpu时间。 16、删除冗余和重复索引 反例: KEY `idx_userId` (`userId`) KEY `idx_userId_age` (`userId`,`age`) 正例: //删除userId索引,因为组合索引(A,B)相当于创建了(A)和(A,B)索引 KEY `idx_userId_age` (`userId`,`age`) 理由: 重复的索引需要维护,并且优化器在优化查询的时候也需要逐个地进行考虑,这会影响性能的。 17、如果数据量较大,优化你的修改/删除语句。 避免同时修改或删除过多数据,因为会造成cpu利用率过高,从而影响别人对数据库的访问。 反例: //一次删除10万或者100万+? delete from user where id <100000; //或者采用单一循环操作,效率低,时间漫长 for(User user:list){ delete from user; } 正例: //分批进行删除,如每次500 delete user where id<500 delete product where id>=500 and id<1000; 理由: 一次性删除太多数据,可能会有lock wait timeout exceed的错误,所以建议分批操作。 18、where子句中考虑使用默认值代替null。 反例: select * from user where age is not null; 正例: //设置0为默认值 select * from user where age>0; 理由: 并不是说使用了is null 或者 is not null 就会不走索引了,这个跟mysql版本以及查询成本都有关。 如果mysql优化器发现,走索引比不走索引成本还要高,肯定会放弃索引,这些条件!=,>is null,is not null经常被认为让索引失效,其实是因为一般情况下,查询的成本高,优化器自动放弃的。 如果把null值,换成默认值,很多时候让走索引成为可能,同时,表达意思会相对清晰一点。 19、不要有超过5个以上的表连接 连表越多,编译的时间和开销也就越大。 把连接表拆开成较小的几个执行,可读性更高。 如果一定需要连接很多表才能得到数据,那么意味着糟糕的设计了。 20、exist & in的合理利用 假设表A表示某企业的员工表,表B表示部门表,查询所有部门的所有员工,很容易有以下SQL: select * from A where deptId in (select deptId from B); 这样写等价于: 先查询部门表B select deptId from B 再由部门deptId,查询A的员工 select * from A where A.deptId = B.deptId 可以抽象成这样的一个循环: List<> resultSet ; for(int i=0;i<B.length;i++) { for(int j=0;j<A.length;j++) { if(A[i].id==B[j].id) { resultSet.add(A[i]); break; } } } 显然,除了使用in,我们也可以用exists实现一样的查询功能,如下: select * from A where exists (select 1 from B where A.deptId = B.deptId); 因为exists查询的理解就是,先执行主查询,获得数据后,再放到子查询中做条件验证,根据验证结果(true或者false),来决定主查询的数据结果是否得意保留。 那么,这样写就等价于: select * from A,先从A表做循环 select * from B where A.deptId = B.deptId,再从B表做循环. 同理,可以抽象成这样一个循环: List<> resultSet ; for(int i=0;i<A.length;i++) { for(int j=0;j<B.length;j++) { if(A[i].deptId==B[j].deptId) { resultSet.add(A[i]); break; } } } 数据库最费劲的就是跟程序链接释放。假设链接了两次,每次做上百万次的数据集查询,查完就走,这样就只做了两次;相反建立了上百万次链接,申请链接释放反复重复,这样系统就受不了了。即mysql优化原则,就是小表驱动大表,小的数据集驱动大的数据集,从而让性能更优。 因此,我们要选择最外层循环小的,也就是,如果B的数据量小于A,适合使用in,如果B的数据量大于A,即适合选择exist。 21、尽量用 union all 替换 union 如果检索结果中不会有重复的记录,推荐union all 替换 union。 反例: select * from user where userid=1 union select * from user where age = 10 正例: select * from user where userid=1 union all select * from user where age = 10 理由: 如果使用union,不管检索结果有没有重复,都会尝试进行合并,然后在输出最终结果前进行排序。如果已知检索结果没有重复记录,使用union all 代替union,这样会提高效率。 22、索引不宜太多,一般5个以内。 索引并不是越多越好,索引虽然提高了查询的效率,但是也降低了插入和更新的效率。 insert或update时有可能会重建索引,所以建索引需要慎重考虑,视具体情况来定。 一个表的索引数最好不要超过5个,若太多需要考虑一些索引是否没有存在的必要。 23、尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型 反例: king_id` varchar(20) NOT NULL COMMENT '守护者Id' 正例: `king_id` int(11) NOT NULL COMMENT '守护者Id'` 理由: 相对于数字型字段,字符型会降低查询和连接的性能,并会增加存储开销。 24、索引不适合建在有大量重复数据的字段上,如性别这类型数据库字段。 因为SQL优化器是根据表中数据量来进行查询优化的,如果索引列有大量重复数据,Mysql查询优化器推算发现不走索引的成本更低,很可能就放弃索引了。 25、尽量避免向客户端返回过多数据量。 假设业务需求是,用户请求查看自己最近一年观看过的直播数据。 反例: //一次性查询所有数据回来 select * from LivingInfo where watchId =useId and watchTime >= Date_sub(now(),Interval 1 Y) 正例: //分页查询 select * from LivingInfo where watchId =useId and watchTime>= Date_sub(now(),Interval 1 Y) limit offset,pageSize //如果是前端分页,可以先查询前两百条记录,因为一般用户应该也不会往下翻太多页, select * from LivingInfo where watchId =useId and watchTime>= Date_sub(now(),Interval 1 Y) limit 200 ; 26、当在SQL语句中连接多个表时,请使用表的别名,并把别名前缀于每一列上,这样语义更加清晰。 反例: select * from A inner join B on A.deptId = B.deptId; 正例: select memeber.name,deptment.deptName from A member inner join B deptment on member.deptId = deptment.deptId; 27、尽可能使用varchar/nvarchar 代替 char/nchar。 反例: `deptName` char(100) DEFAULT NULL COMMENT '部门名称' 正例: `deptName` varchar(100) DEFAULT NULL COMMENT '部门名称' 理由: 因为首先变长字段存储空间小,可以节省存储空间。 其次对于查询来说,在一个相对较小的字段内搜索,效率更高。 28、为了提高group by 语句的效率,可以在执行到该语句前,把不需要的记录过滤掉。 反例: select job,avg(salary) from employee group by job having job ='president' or job = 'managent' 正例: select job,avg(salary) from employee where job ='president' or job = 'managent' group by job; 29、如何字段类型是字符串,where时一定用引号括起来,否则索引失效 反例: select * from user where userid =123; 正例: select * from user where userid ='123'; 理由: 为什么第一条语句未加单引号就不走索引了呢? 这是因为不加单引号时,是字符串跟数字的比较,它们类型不匹配,MySQL会做隐式的类型转换,把它们转换为浮点数再做比较。 30、使用explain 分析你SQL的计划 日常开发写SQL的时候,尽量养成一个习惯吧。用explain分析一下你写的SQL,尤其是走不走索引这一块。 explain select * from user where userid =10086 or age =18;

剑曼红尘 2020-04-21 14:01:32 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 云栖号物联网 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 云栖号弹性计算 阿里云云栖号 云栖号案例 云栖号直播