【发布时间】:2014-07-04 04:41:41
【问题描述】:
我必须做一些报告,并且必须在 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 个条件,取决于 mode(0 到 7):
- 一周的第一天(星期日或星期一)(在 Java 中也是如此)
-
第一周的最少天数是 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功能)。那么有没有什么方法可以满足很多 RDBMS 的计算周数呢?
我有一个想法是在一个平台(Java 或 MySQL)中计算周,然后将结果传递给另一个:
如果从 Java 传递到 MySQL,我已经将结果传递给查询字符串,或者构建一个包含我的结果的表
如果从 MySQL 传递到 Java,我必须编写一个过程从 Java 调用它,并且必须解决“找到计算周数的方法满足许多 RDBMS”的问题
但我必须计算大量日期,这些都不能让我满意,有人有想法解决我的问题吗?
【问题讨论】:
-
你打算在 MySQL 方面做什么?一般来说,您不想在列中的日期上调用这些函数,因为它会使索引的使用无效(即,不要用于按周分组)...
-
"Oracle 没有 WEEK 函数)" - Oracle 确实具有从日期中提取星期的功能。它只是不叫
week():你需要使用to_char(some_date, 'IW')。 -
@a_horse_with_no_name 我的意思是当我将 DB 更改为 oracle 时,我也必须更改我的 sql 查询。最后决定用日历表(Dimension Date表),一般用在报表中
标签: java sql date datetime week-number