在从数据库中获取所需信息时遇到一些问题。我在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周,但这似乎有点大麻,我不确定它会真正起作用。
答案 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事件和不正确的事件。