我用Java创建了一个小程序。在日期字段中,这是一个组合框,只选择月份和日期为02/2016
。有没有办法在mmql中记录这个日期格式mm / yy field only?
答案 0 :(得分:1)
你不应该这样做,并且没有本地方法这样做。只需将其保存为mysql中的普通DATE,并在查询数据库SELECT MONTH(datefield), YEAR(datefield)
或使用java解析日期时。 mysql日期和日期时间类型包括日期,包括一天(或包括时间)。为了能够查询范围和其他日期相关的东西,您应该坚持预期的存储日期方式。 Mysql具有出色的日期时间功能,你不应该做一些让你远离你的东西。
答案 1 :(得分:1)
不是以这种格式存储,也许最好的方法是将其存储为正常日期,并将日期始终设置为该月的第一天。 然后在检索时,您可以使用类似SimpleDateFormat的方式格式化日期,只获取月份和年份并将其返回到您的UI。
答案 2 :(得分:0)
ISO 8601标准为表示日期时间值的字符串定义了许多格式。其中一个是一年零一个月,没有任何日期,没有时区,没有时间:YYYY-MM
。示例:2016年2月的2016-02
。
将这些标准字符串保存在数据库的文本列中。请注意,按字母顺序排序也意味着按时间顺序排列。
在解析/生成表示日期时间值的字符串时,java.time类默认使用ISO 8601标准格式。
YearMonth
类表示没有日期的年 - 月值。在您的应用中,使用这些对象而不仅仅是字符串或数字。这样做可以提供类型安全性,确保有效值,并使您的代码更加自我记录。
YearMonth ym = YearMonth.of( 2016 , 2 );
String output = ym.toString(); // 2016-02
转向另一个方向,解析标准字符串。
YearMonth ym = YearMonth.parse( "2016-02" );
您可以执行文本查询,因为按字母顺序排序时,标准格式按时间顺序排列。 ISO委员会的人员非常聪明。
例如,要查询2016年第一季度的值:
WHERE expiration >= '2016-01'
AND expiration <= '2016-03'
此外,在日期时间工作中,我们通常使用半开放方法来开始包含的时间跨度,而结尾是独占
WHERE expiration >= '2016-01'
AND expiration < '2016-04' // Up to, but not including, the month at end of this span.
当然,您确实应该使用PreparedStatement
而不是原始SQL查询。
YearMonth q2016_ymStart = YearMonth.of( 2016 , 1 ); // 2016-01
YearMonth q2016_ymStop = q2016_ymStart.plusMonths( 3 ); // 2016-04 for half-open quarter.
…
myPreparedStatement.setString( … , q2016_ymStart.toString() );
myPreparedStatement.setString( … , q2016_ymStop.toString() );
说到季度,请参阅ThreeTen-Extra项目YearQuarter
和Quarter
类。
LocalDate
要将YearMonth
转换为日期,请使用LocalDate
类。
LocalDate firstOfMonth = ym.atDay( 1 );
LocalDate endOfMonth = ym.atEndOfMonth();
ZonedDateTime
要将YearMonth
转换为时间轴上的某个时刻,请为业务方案指定的上下文指定时区。让java.time确定一天中的第一个时刻,因为第一个时刻不总是00:00:00
。
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ym.atDay( 1 ).atStartOfDay( z );
对于数据库访问,您的JDBC 4.2兼容驱动程序可以通过调用PreparedStatement::setObject
和ResultSet::getObject
方法直接处理这些java.time类型。
如果没有,请回退到使用添加到那些旧类的新方法将java.time类型转换为旧的java.sql类型。搜索Stack Overflow以获取更多信息。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; 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。