ISO 주 대 SQL Server 주


33

이번 주와 지난 주 비교에 대한 보고서가 있는데 고객이 데이터가 "펑키"하다는 것을 알았습니다. 추가 조사 결과 ISO 표준에 따라 몇 주가 올바르게 수행되지 않는 것으로 나타났습니다. 이 스크립트를 테스트 사례로 실행했습니다.

SET DATEFIRST 1
SELECT DATEPART(WEEK, '3/26/13')
    , DATEPART(WEEK, '3/27/12')
    , DATEPART(WEEK, '3/20/12')
    , DATEPART(WEEK, '1/2/12')
SELECT DATEPART(ISO_WEEK, '3/26/13')
    , DATEPART(ISO_WEEK, '3/27/12')
    , DATEPART(ISO_WEEK, '3/20/12')
    , DATEPART(ISO_WEEK, '1/2/12')

실행하면이 결과를 얻었습니다.

결과 세트

나는 이것이 독창적이라고 생각하고 좀 더 파고 들었고 SQL Server는 1 월 1 일을 첫 번째 주로 계산하고 ISO가 1 월 첫 번째 일요일을 첫 주로 계산하는 것을 발견했다.

그런 다음 질문은 두 가지로 끝납니다. 질문 1 왜 이런가요? 질문 2 이것을 바꿀 수있는 방법이 있으므로 ISO_Week어디에서나 사용하기 위해 모든 코드를 수정할 필요가 없습니까?

답변:


27

SQL Server가 처음 WEEK날짜 / 부분을 구현했을 때는 선택해야했습니다. 당시 가장 일반적인 표준에 부합하는 것을 제외하고는 그것에 대해 많은 의식이 있다고 생각하지 않습니다. 표준에 부합하는 것이 최우선 순위가 아닌시기에 기억하십시오. timestamp, IDENTITYTOP). 그들은 나중에 ISO_WEEK(2008 믿습니다) 해결책을 찾았습니다. 그 동안의 해결책은 느리고 엉뚱한 스칼라 UDF를 작성하는 것이 었습니다. 실제로 그들은 실제로 나쁜 문서를 만들어 공식 문서에 넣었습니다. 내가 알 수 있듯이).

DATEPART(WEEK척 하는 방법을 모르겠습니다 DATEPART(ISO_WEEK. 코드를 변경해야한다고 생각합니다 (소스 제어를 사용하는 경우 매우 어렵지 않아야합니다-이 계산을 수행하는 장소는 몇 개입니까? 코드를 복잡하게 만들 필요가 없도록 어딘가에서 계산하는 것에 대해 생각 했습니까? 지금 코드를 변경하고 있기 때문에 이것을 고려할 때가되었을 것입니다 ...).

그리고 왜 그 이유에 대한 답을 원한다면 ? 나는 원래 개발자 중 일부를 잡아서 그들이 왜 기본값을 선택했는지 결정해야한다고 생각합니다. 다시, 나는 그것이 실제 "F 표준이 아니었다"고 생각합니다. 선택, 오히려 "어떤 표준?"

여기에 유용한 몇 가지 정보가 있습니다.

https://stackoverflow.com/questions/348880/getting-week-number-off-a-date-in-ms-sql-server-2005

http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/iso-week-in-sql-server


기술적으로 내가해야 할 일은 불행히도 DimCalendar 테이블을 변경하는 것입니다. 개발자가 여러 보고서 인스턴스에서 테이블을 사용하지 않기로 결정했기 때문에 즉시 계산됩니다. 대체로 이것은 어떤 종류의 위기보다 호기심에 대한 운동이었습니다.
Zane

5
개발자가 카우보이 코딩보다는 모범 사례를 따르도록 보고서를 업데이트하도록 제안합니다. 그러나 그것은 단지 나입니다.
Aaron Bertrand

1
좋은 소식은 일주일 안에 더 이상 개발자가되지 않는다는 것입니다. :)
Zane

2

연중 첫 주에 다른 조건을 가정하는 여러 기관이 있습니다. 일부는주의 첫날이 첫 번째 주를 시작한다고 가정하지만 가장 일반적인 생각은 첫 번째 목요일이있는 첫 번째 주가 그해의 첫 주입니다.

그래서 ISO_WEEK2010 년 2011 년 또는 2012 년에 확인할 수있는 것처럼 그 것을 받아 ISO_WEEK1월 1일가 52 또는 53 주 동안 말합니다 WEEK하거나 WK또는 WW그들이 첫 주 말합니다.

SELECT DATEPART (WW,'01/01/2010')   --> 1
SELECT DATEPART (WK,'01/01/2010')   --> 1
SELECT DATEPART (WEEK,'01/01/2010')   --> 1
SELECT DATEPART (ISO_WEEK,'01/01/2010')   --> 53
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.