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, IDENTITY및 TOP). 그들은 나중에 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.