在mysql数据库中仅创建月份和年份列

时间:2016-11-25 23:09:05

标签: java mysql

我用Java创建了一个小程序。在日期字段中,这是一个组合框,只选择月份和日期为02/2016。有没有办法在mmql中记录这个日期格式mm / yy field only?

3 个答案:

答案 0 :(得分:1)

你不应该这样做,并且没有本地方法这样做。只需将其保存为mysql中的普通DATE,并在查询数据库SELECT MONTH(datefield), YEAR(datefield)或使用java解析日期时。 mysql日期和日期时间类型包括日期,包括一天(或包括时间)。为了能够查询范围和其他日期相关的东西,您应该坚持预期的存储日期方式。 Mysql具有出色的日期时间功能,你不应该做一些让你远离你的东西。

答案 1 :(得分:1)

不是以这种格式存储,也许最好的方法是将其存储为正常日期,并将日期始终设置为该月的第一天。 然后在检索时,您可以使用类似SimpleDateFormat的方式格式化日期,只获取月份和年份并将其返回到您的UI。

答案 2 :(得分:0)

ISO 8601

ISO 8601标准为表示日期时间值的字符串定义了许多格式。其中一个是一年零一个月,没有任何日期,没有时区,没有时间:YYYY-MM。示例:2016年2月的2016-02

数据库存储

将这些标准字符串保存在数据库的文本列中。请注意,按字母顺序排序也意味着按时间顺序排列。

的Java

在解析/生成表示日期时间值的字符串时,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项目YearQuarterQuarter类。

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::setObjectResultSet::getObject方法直接处理这些java.time类型。

如果没有,请回退到使用添加到那些旧类的新方法将java.time类型转换为旧的java.sql类型。搜索Stack Overflow以获取更多信息。

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore