我必须做一些报告,并且必须在Java和MySQL中计算任何日期 但他们有不同的算法。
首先,请注意,通过某些方法,在某一年结束的某些日子里,是明年的第一周。示例:2012-12-31是2013年的第1周(我不记得确切的一年,但它就是这样)。所以我必须计算一个正确的一年的日期
在Java 中,它基于2个标准,取决于区域设置:
第一周(1或4)的最短天数
Calendar cal = Calendar.getInstance();
int javaWeek = cal.get(Calendar.WEEK_OF_YEAR);
int weekYear = cal.getWeekYear();
在MySQL 中,它基于2个标准,取决于模式(0到7):
第一周的最短天数是4或第一周包含一周的第一天
SELECT WEEK('2012-12-12', 1);
SELECT YEARWEEK('2012-12-12', 1);
在MySQL中,有些模式会在本周计算出奇怪的结果,例如,一年有0周只有1天,其他几周则有7天(我认为第1周真的是第一周,而且第0周是一周前或某事)。我会忽略这些模式
方案是:我在Java中计算了我的系统区域设置(带有设置:getFirstDayOfWeek()==SUNDAY
和getMinimalDaysInFirstWeek==1
的区域设置)的日期库列表周,我想要使用相同的结果在MySQL中计算
但我在MySQL中尝试所有8种模式,没有匹配。我失败了,因为在MySQL中没有第一周最小日的模式计算基础是1(只有一些模式有4),所以我手动setMinimalDaysInFirstWeek(4)
和MySQL中的模式6匹配Java中的结果
(我必须编写测试,比较Java和MySQL中2年内每天的结果)
所以 我的解决方案 是,我必须修复 setMinimalDaysInFirstWeek(4)
,如果getFirstDayOfWeek()
是星期一,我选择MySQL中的模式3,如果getFirstDayOfWeek()
是SUNDAY,我在MySQL中选择模式6。我认为这只是一个临时解决方案而且非常奇怪。
还有一个问题,我真的害怕如果我的系统从MySQL变为其他RDBMS,它将有其他方法而我无法处理所有这些(Oracle中的示例没有WEEK功能)。那么有什么方法可以让calc周满足很多RDBMS吗?
我有一个想法是在一个平台(Java或MySQL)中计算一周,然后将结果传递给另一个:
如果从Java传递到MySQL,我将结果传递给查询字符串,或者构建一个包含我的结果的表
如果从MySQL传递给Java,我必须编写一个程序来从Java调用它,并且必须解决问题“找到计算方法满足许多RDBMS的方法”
但是我必须计算一个大量的日期,这些都不能满足我,任何人都有想法解决我的问题?