为什么SQL Server周数与Java周数不同?

jaf*_*att 3 java sql date week-number sql-server-2008

我正在使用Java 6和SQL Server 2008编写报表系统.对于某些查询,我想按周编号查看数据.我正在使用Java来填补数据中的空白以形成连续的时间线,我发现了这一点

java.util.Calendar cal = new java.util.GregorianCalendar();
cal.set(2012, 0, 1);
cal.get(Calendar.WEEK_OF_YEAR);
Run Code Online (Sandbox Code Playgroud)

org.joda.time.DateTime date = new org.joda.time.DateTime(2012, 01, 01, 0, 0);
date.getWeekOfWeekyear();
Run Code Online (Sandbox Code Playgroud)

返回不同的周数

DATEPART(WEEK, '2012-01-01')
Run Code Online (Sandbox Code Playgroud)

有没有办法解决这个差异,还是我必须选择使用SQL Server Java周数?

TIA

Gar*_*thD 6

在计算周数时,Java更复杂,而SQL-Server DATEPART(WEEK ......更简单.我在这里记录了以下内容)

"当设置或获取WEEK_OF_MONTH或WEEK_OF_YEAR字段日历必须确定一个月或一年的第一周作为参考点.一个月或一年的第一周被定义为开始于getFirstDayOfWeek(最早的七天内)和含至少getMinimalDaysInFirstWeek()"

我认为这违反了ISO标准,这是一周中的第一周(周一至周日,每年至少4天).考虑使用:

在SQL Server中,DATEPART(WEEK, ..)函数更简单,它只是计算DATEFIRST1月1日和输入日期之间的星期边界(由定义),因此1月1日将始终是第1 周.您可能希望考虑使用:

SELECT DATEPART(ISO_WEEK, '01/01/2012')
Run Code Online (Sandbox Code Playgroud)

这将获得ISO标准定义的周数,这是一周中的第一周,周四(周一至周日,每年至少4天).

因为,如上所述SQL Server在计算中更简单,所以无法配置,这意味着您需要在Java中配置周数.只需确保使用正确的值设置Java日历,getFirstDayOfWeek()并且getMinimalDaysInFirstWeek():

public static Calendar getISOCalendar() {
    Calendar calendar = Calendar.getInstance();
    calendar.setMinimalDaysInFirstWeek(4);
    calendar.setFirstDayOfWeek(Calendar.MONDAY);
    return calendar;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以确保一致的周数.

public static void main(String args[]) {
    Calendar calendar = getISOCalendar();
    calendar.set(2012,0,1);
    System.out.println(calendar.get(Calendar.WEEK_OF_YEAR));
}

------
52
Run Code Online (Sandbox Code Playgroud)