SQL 2008,周数和年份

时间:2015-06-22 15:10:36

标签: sql-server-2008

在从数据库中获取所需信息时遇到一些问题。我在DATEPART中与iso_week设置相比犯了一周的犯规,但现在却遇到了从中获得一年的问题。问题的核心是当我运行时

SELECT datePart(iso_week, '2014-12-29');

SELECT datePart(week, '2014-12-29');

SELECT datePart(YEAR, '2014-12-29');

第一次查询获得Wk 1,第二次获得Wk 53。 (首先是我想要的)但是今年仍然是2014年。所以,如果我这样做

SELECT CONCAT('WK', RIGHT(CONCAT('00', DATEPART(iso_week, '2014-12-29')), 2), ' ',  DATEPART(year, '2014-12-29'))

我获得2014年WK01而非2015年WK01。

任何人都知道我可以获得正确的ISO周和相关年份的约会方式吗?

编辑:

看看我能不能在这里清理一下。

不要指望上述情况会在2015年而不是2014年返回,这将是愚蠢的。我需要的是一种方法来知道返回的周数实际上是在明年。我确实考虑过如果一周做一个> 52然后在明年第1周,但这似乎有点大麻,我不确定它会真正起作用。

3 个答案:

答案 0 :(得分:2)

您应该了解ISO_WEEK的计算方式。来自Microsoft

  

ISO 8601包括ISO周日期系统,一个编号系统   周。 每周与周四发生的年份相关。   例如,2004年第1周(2004W01)从2003年12月29日星期一开始   到2004年1月4日星期日。一年中最高的一周数可能是   52或53.这种编号方式通常用于欧洲   国家/地区,但在其他地方很少见。

因此,您应该在2014年12月29日或之后的星期四通过DATEPART(YEAR, ...)

答案 1 :(得分:0)

试试这个

SELECT CONCAT('WK', RIGHT(CONCAT('00', DATEPART(iso_week, '2014-12-29') % 53), 2), ' ',  DATEPART(year, '2014-12-29') + DATEPART(iso_week, '2014-12-29') % 53)

答案 2 :(得分:0)

如果有人用一些简单的逻辑让我走上正轨。我试图使事情复杂化。这似乎适用于我可以投入的一切。

DECLARE @date AS DATETIME
SET @date = '2014-12-29'

SELECT
    CAST(
    CASE 
        WHEN MONTH(@Date) = 1 AND DATEPART(iso_week, @date) > 51 THEN YEAR(@Date) - 1
        WHEN MONTH(@Date) = 12 AND DATEPART(iso_week, @date) = 1 THEN YEAR(@Date) + 1
        ELSE YEAR(@Date)
    END
    AS VARCHAR(4)) AS Year
,
RIGHT('00' + CAST(DATEPART(iso_week, @date) AS VARCHAR(2)), 2) AS Week

它似乎涵盖了真正的wk53事件和不正确的事件。