3

我正在使用 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);

org.joda.time.DateTime date = new org.joda.time.DateTime(2012, 01, 01, 0, 0);
date.getWeekOfWeekyear();

返回一个不同的周数

DATEPART(WEEK, '2012-01-01')

是否有解决这种差异的方法,或者我是否必须选择使用 SQL ServerJava 周数?

TIA

4

5 回答 5

6

Java 在计算周数时更加复杂,而 SQL-Server DATEPART(WEEK... 更加简单。我发现以下文档记录在这里

“在设置或获取 WEEK_OF_MONTH 或 WEEK_OF_YEAR 字段时,Calendar 必须确定月份或年份的第一周作为参考点。月份或年份的第一周定义为从 getFirstDayOfWeek() 开始并包含至少 getMinimalDaysInFirstWeek() "

我认为这默认为ISO标准,这是一年中的第一周,其中有一个星期四(星期一至星期日,一年中至少有 4 天)。考虑使用:

在 SQL Server 中,该DATEPART(WEEK, ..)函数要简单得多,它只是计算DATEFIRST1 月 1 日和输入日期之间的周边界数(由 定义),因此 1 月 1 日始终是第 1 周。您不妨考虑使用:

SELECT DATEPART(ISO_WEEK, '01/01/2012')

这将获得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;
}

然后,您可以确保一致的周数。

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

------
52
于 2012-02-01T15:33:14.407 回答
1

根据他们各自的文档,java.util.calendarjodaDATEPART都返回一个 1 到 53 之间的整数,表示星期。该值基于定义为一周的第一天和默认日历(例如公历、中文)的内容。我会检查您的默认设置或查看每个人认为一周的第一天是什么。

于 2012-02-01T15:37:33.133 回答
0

我认为这可能与 2011 年有关,并且根据 SQLServer 的说法它有 53 周的想法。看一月/新年的 SQL 问题!,这个解决方案可能有助于更好地处理 SQLServer 的东西:

DATEPART(WEEK, DATEADD(WEEK, -1, '2012-01-01'))

于 2012-02-01T15:23:11.877 回答
0
于 2016-10-18T21:37:46.570 回答
-1
   System.out.println("get date range from week number and year in java");
   System.out.println(); // print a blank line

   // get the input from the user
   Scanner sc = new Scanner(System.in);

   System.out.print("Enter the week : ");
   int weekNumber  = sc.nextInt(); 
   System.out.print("Enter the Year: ");
   int year = sc.nextInt() ;



   Calendar cal = Calendar.getInstance();
   //cal.setTime(new Date());

   cal.set(Calendar.YEAR, year);
   cal.set(Calendar.WEEK_OF_YEAR, weekNumber);

   SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

   cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
   System.out.println(formatter.format(cal.getTime())); // start date

   cal.add(Calendar.DAY_OF_WEEK, 6);
   System.out.println(formatter.format(cal.getTime())); // end date
于 2012-09-07T14:08:05.387 回答