我同时使用Mongo和Oracle 12c。
对于MongoDB,我使用ISO DATE
(但是像String一样)来保持日期。像这样:
{
"_id" : null,
"fields" : {
"Status" : "UnderInvestigation",
"Assignee" : "",
"CreationDate" : "2016-12-14T00:00:00Z", //ISO DATE
"CaseId" : "8165021",
"RunningMode" : "STS",
"CloserDueDate" : ""
},
"domain" : {},
"arrays" : {}
}
我想在Oracle中使用Timestamp格式类型来获取具有相同名称的列,因此我们的想法是将该日期转换为时间戳。
我不知道该怎么做。我有以下代码,但它不起作用。
final String query = "INSERT INTO " + TABLE_APPLICATION + " (CreationDate) VALUES (TO_DATE(?,'YYYY-MM-DD HH24:MI:SS'))" ;
PreparedStatement ps = getPreparedStatement();
((OraclePreparedStatement) ps).setString(1, getValueFromJson(JSON, 'fields.CreationDate'));
但我得到了:
java.sql.SQLDataException:ORA-01861:el literal no conide con la cadena de formato
问题是什么?
答案 0 :(得分:2)
Oracle解决方案:
SELECT TO_TIMESTAMP_TZ(
'2016-12-14T00:00:00Z',
'YYYY-MM-DD"T"HH24:MI:SSTZH:TZM'
)
FROM DUAL;
所以你的代码应该是:
final String query = "INSERT INTO " + TABLE_APPLICATION + " ("
+ "CreationDate"
+ ") VALUES ("
+ "TO_TIMESTAMP_TZ( ?, 'YYYY-MM-DD\"T\"HH24:MI:SSTZH:TZM')"
+ ")";
答案 1 :(得分:1)
我SimpleDateFormat解析你的字段Date和getTime()你返回millisTime exact。
//String base = "YYYY-MM-ddTkk:mm:ssZ";
//"date": "2016-11-22T16:59:01+01:00"
String timeform = "YYYY-MM-dd-kk-mm-ss-Z";
Date datec = new Date();
//si null ont crée une nouvelle date
if (!json.isNull("date"))
{
DateFormat format = new SimpleDateFormat(timeform, Locale.FRANCE);
try {
datec = format.parse(json.getString("date"));
} catch (ParseException e){}
}
datec.getTime();
答案 2 :(得分:0)
要在Java而不是SQL中执行此操作,请使用java.time类。
Instant
类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。
您的输入字符串采用标准ISO 8601格式。默认情况下,java.time类使用这些标准格式。因此,无需指定格式化模式。
Instant instant = Instant.parse( "2016-12-14T00:00:00Z" );
如果JDBC驱动程序支持JDBC 4.2或更高版本,则可以通过PreparedStatement::setObject
/ ResultSet::getObject
方法传递/获取java.time对象。
myPreparedStatement.setObject( 1 , instant );
或许您需要指定SQLType
。
myPreparedStatement.setObject( 1 , instant , JDBCType.TIMESTAMP_WITH_TIMEZONE );
如果JDBC驱动程序未指定java.time类型,则回退到使用旧的java.sql类型。调用添加到旧类中的新方法进行转换。
java.sql.Timestamp ts = java.sql.Timestamp.from( instant );
myPreparedStatement.setTimestamp( 1 , ts );
你的问题确实与许多其他问题重复。搜索这些类名称的Stack Overflow以获得更多示例和讨论。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。