Java和多SQL RDBMS之间的一周计算差异

时间:2014-07-04 04:41:42

标签: java sql date datetime week-number

我必须做一些报告,并且必须在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):

  • 一周的第一天(星期日或星期一)(这与Java相同)
  • 第一周的最短天数是4或第一周包含一周的第一天

    SELECT WEEK('2012-12-12', 1);
    SELECT YEARWEEK('2012-12-12', 1);
    

在MySQL中,有些模式会在本周计算出奇怪的结果,例如,一年有0周只有1天,其他几周则有7天(我认为第1周真的是第一周,而且第0周是一周前或某事)。我会忽略这些模式

方案是:我在Java中计算了我的系统区域设置(带有设置:getFirstDayOfWeek()==SUNDAYgetMinimalDaysInFirstWeek==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的方法”

但是我必须计算一个大量的日期,这些都不能满足我,任何人都有想法解决我的问题?

0 个答案:

没有答案