Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么SQL Server周数与Java周数不同?_Java_Sql_Sql Server 2008_Date_Week Number - Fatal编程技术网

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

为什么SQL Server周数与Java周数不同?,java,sql,sql-server-2008,date,week-number,Java,Sql,Sql Server 2008,Date,Week Number,我正在使用Java6和SQLServer2008开发一个报告系统。对于一些查询,我想按周数查看数据。我使用Java来填补数据中的空白,从而形成一条连续的时间线,我发现 java.util.Calendar cal = new java.util.GregorianCalendar(); cal.set(2012, 0, 1); cal.get(Calendar.WEEK_OF_YEAR); 及 将不同的周数返回到 DATEPART(WEEK, '2012-01-01') 有没有解决这种差异的

我正在使用Java6和SQLServer2008开发一个报告系统。对于一些查询,我想按周数查看数据。我使用Java来填补数据中的空白,从而形成一条连续的时间线,我发现

java.util.Calendar cal = new java.util.GregorianCalendar();
cal.set(2012, 0, 1);
cal.get(Calendar.WEEK_OF_YEAR);

将不同的周数返回到

DATEPART(WEEK, '2012-01-01')
有没有解决这种差异的方法,或者我必须选择使用SQL Server或Java周数


TIA

我认为这可能与2011年有关,根据SQLServer,它有53周的时间。现在来看,此解决方案可能有助于更好地处理SQLServer内容:


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

Java在计算周数时更为复杂,而SQL Server DATEPART(WEEK…)则更为简单。我发现以下文件

设置或获取“月中的周”或“年中的周”字段时,日历必须确定月或年中的第一周作为参考点。月或年中的第一周定义为从getFirstDayOfWeek()开始并至少包含getMinimalDaysInFirstWeek()的最早七天期间

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

SELECT DATEPART(ISO_WEEK, '01/01/2012')
在SQLServer中,<代码> DATEPART(星期,…)< /C>函数更简单,它简单地计算一月一日边界和输入日期之间的周界数(如<代码> DATE1E/COD>),因此1月1日将<强>始终< /强>为第1周。
SELECT DATEPART(ISO_WEEK, '01/01/2012')
这将获得标准定义的周数,即一年中第一周的星期四(星期一至星期日,其中一年中至少有4天)

正如所述,SQL Server的计算更加简单,因此无法进行配置,这意味着您需要在Java中配置周数。只需确保在Java中为
getFirstDayOfWeek()
getMinimalDaysInFirstWeek()设置正确的日历值即可:

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

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

------
52

根据各自的文档,、和都返回一个介于1和53之间的整数,表示一周。该值基于定义为一周的第一天和默认日历(如公历、中文)。我将检查您的默认值或查看每个人认为一周的第一天是什么。

tl;dr
   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
一周的许多定义 一周有很多定义

对一些人来说,一周的第一天是星期天,其他人是星期一,还有一些人是另一天

对于一些人来说,一年中的第一周包含1月1日,而另一些人将第一周视为包含上述周初日的一周,而另一些人将第一周视为包含一周中特定的一天

因此,在不研究文档的情况下,决不能假定“周”或“周数”的含义

避免遗留日期时间类 一般来说,您应该避免将旧的遗留日期时间类与最早的Java版本捆绑在一起,因为它们设计糟糕、容易混淆且麻烦

这里特别指出的是,
java.util.Calendar
类有一个周的定义,该定义因地区而异。因此,如果您想要可靠的常量结果,请不要使用该定义

ISO 8601 本标准定义了日期时间值的格式和相关问题。它定义了一周和一年中一周的含义:

  • 本周从周一至周日开始,编号为1-7,其中周一=1
  • 第1周包含一年中的第一个星期四,每年产生52或53周
乔达时间 Joda时间库使用周和一年中的周的标准定义

但是,请注意,该项目现在正在进行中,团队建议迁移到java.time

java.time time类使用了一周的定义:week#1有第一个星期四,week运行在星期一和星期天

该类定义了基于周的年份。我们可以要求:

  • 年份周数()
  • 基于周的年份的年份编号()
首先我们得到当前的日期和时间

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now ( zoneId );
询问date time对象,询问基于标准周的年份

int week = now.get ( IsoFields.WEEK_OF_WEEK_BASED_YEAR );
int weekYear = now.get ( IsoFields.WEEK_BASED_YEAR );
转储到控制台

System.out.println ( "now: " + now + " is week: " + week + " of weekYear: " + weekYear );
现在:2016-01-17T20:55:27.263-05:00[美国/蒙特利尔]是一周中的第2周

有关更多信息,请参阅类似问题:

WeekFields
在java.time中,您还可以调用该类,例如.应具有与java 8或更高版本中的
IsoFields
相同的效果(一些在java 8的早期版本中)


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,如,&

该项目现已启动,建议迁移到java.time

要了解更多信息,请参阅.和搜索堆栈溢出以获取许多示例和解释。规范为

从哪里获得java.time类

  • 后来
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门针对Android采用了Three Ten Backport(如上所述)

该项目使用额外的类扩展了java.time。该项目是将来可能添加到java.time的一个试验场。您可以在这里找到一些有用的类,如、、。

您在上面的代码示例中看到了哪些值?仅供参考,非常麻烦的旧日期时间类,如、
j
int week = now.get ( IsoFields.WEEK_OF_WEEK_BASED_YEAR );
int weekYear = now.get ( IsoFields.WEEK_BASED_YEAR );
System.out.println ( "now: " + now + " is week: " + week + " of weekYear: " + weekYear );