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

Java 在mysql数据库中仅创建月和年列,java,mysql,Java,Mysql,我正在用Java创建一个小程序。在date字段中,它是一个组合框,用于只选择月份和日期作为02/2016。有没有办法在mysql中只在mm/yy字段中记录此日期格式?您不应该这样做,也没有本机方法可以这样做。只需将其保存为mysql中的普通日期,在查询数据库时,选择月(datefield)、年(datefield)或使用java解析日期。mysql日期和日期时间类型由包含一天(或包含一个时间)的日期组成。为了能够查询范围和其他与日期相关的内容,您应该坚持预定的存储日期的方式。Mysql有很好的d

我正在用Java创建一个小程序。在date字段中,它是一个组合框,用于只选择月份和日期作为
02/2016
。有没有办法在mysql中只在mm/yy字段中记录此日期格式?

您不应该这样做,也没有本机方法可以这样做。只需将其保存为mysql中的普通日期,在查询数据库时,选择月(datefield)、年(datefield)或使用java解析日期。mysql日期和日期时间类型由包含一天(或包含一个时间)的日期组成。为了能够查询范围和其他与日期相关的内容,您应该坚持预定的存储日期的方式。Mysql有很好的datetime函数,你不应该做一些让它们远离你的事情

与其以这种格式存储,最好的方法可能是将其存储为正常日期,日期始终设置为每月的第一天。 然后在检索时,使用类似SimpleDateFormat的格式对日期进行格式化,以便只获取月份和年份并将其返回到用户界面。

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

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

JAVA 在解析/生成表示日期时间值的字符串时,java.time类默认使用ISO 8601标准格式

该类表示没有日期的年和月值。在应用程序中,使用这些对象,而不仅仅是字符串或数字。这样做可以提供类型安全性,确保有效值,并使代码更加自我记录

YearMonth ym = YearMonth.of( 2016 , 2 );
String output = ym.toString();  // 2016-02
然后转到另一个方向,解析一个标准字符串

YearMonth ym = YearMonth.parse( "2016-02" );
询问 您可以执行文本查询,因为标准格式在按字母顺序排序时是按时间顺序排列的。ISO委员会的人都很聪明

例如,要查询2016年第一季度的值:

其中过期>='2016-01'

至少,以yyyymm格式存储。@草莓实际上是。你是对的,我为他们做的,但真正的问题是在每个月底,分公司在总部以纸质形式发送数据,因为分公司中没有数据库。必须存储在数据库中的数据以纸质形式恢复办公室的财务状况。因此,在现有数据库中,对于此类信息,只需要相关的月份和年份,而不是他们。你不必在你的用户界面上要求一天。请只询问您当前所做的月份和年份。但是,当您在后端收到信息时,在将其作为真实日期存储在MySql中之前,请添加日期(例如月末)。如果数据库中有一些数据只有月份和年份信息作为字符串,那么最好将它们迁移到实际日期,以便能够对它们执行范围和比较操作,并具有高效和一致的索引。如果在数据库中我将其存储为文本列或字符串,是否可能有一个sql请求,例如
select*from table_name,其中日期介于dat1和date2之间
?因为这个请求使用数字和日期格式,但是使用日期作为文本列,所以我不确定它是否有效。如果您只关心年-月,那么日期是不相关的。此外,你们还有一个至关重要的时区问题,我们迄今为止一直忽视了这个问题。在任何特定的时刻,世界各地的日期都因地区而异。搜索Stack Overflow以获取更多关于此的信息。如果您存储的内容类似于信用卡过期,那么这个答案就足够了。对于范围,例如第一季度(1月至3月),搜索
其中expiration>='2016-01'和expiration
WHERE expiration >= '2016-01' 
AND expiration < '2016-04'  // Up to, but not including, the month at end of this span.
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() );
LocalDate firstOfMonth = ym.atDay( 1 );
LocalDate endOfMonth = ym.atEndOfMonth();
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ym.atDay( 1 ).atStartOfDay( z );