2017-11-27 12 views
2

나는 2017.05.10 -> 2017.01.01 또는 2016.08.19 -> 2016.01.01과 같이 일년 중 첫 번째 날을 Q로 얻는 효율적인 함수를 찾고 있습니다.KDB/Q에서 첫해를 얻는 방법?

다음 조각은 작동하지만, "D"의 범위의 일부

{"D"$(string `year$x),".01.01"} .z.d 

답변

6

이런 종류의 계산에서 공통적 인 트릭은 날짜와 달리 월이 매우 규칙적이라는 사실을 사용하는 것입니다. 매년 정확하게 12 개월이 걸립니다. 따라서 올해의 첫 날을 찾기 위해, 우리는 먼저 12의 여러에 둘레 다음 달 형식으로 날짜를 아래로 캐스팅 날짜 형식으로 다시 캐스팅 :

q)f:"d"$12 xbar"m"$ 
q)f .z.d 
2017.01.01 

또는 OP의 날짜와 :

q)f 2017.05.10 2016.08.19 
2017.01.01 2016.01.01 
+0

알렉스, 빠르고 명확한 솔루션을 주셔서 감사합니다. –

4

효율적이지 않다 :

q)"d"$ceiling 365.245*-2000+`year$.z.Z 
2017.01.01 

(날짜입니다 Y2K에서 일)

+0

잭 감사합니다. 외모는 까다 롭지만 잘 작동합니다! –

+2

이 예제는 대부분의 주어진 날짜에 적용될 수 있다고 생각합니다. 그러나 2290 년에 날짜를 입력하면 두 번째 날짜가 표시됩니다. –

+3

해당 날짜를 염두에 둔다면 365.245에서 365.2425로 변경하십시오. (또는 내 대답을 참조하십시오.) –

1

그냥 믹스에 또 다른 변화를 던져 :

q){.Q.addmonths[x;1-`mm$x]+1-`dd$x} .z.d 
2017.01.01 
+2

완전을 위해 ['.Q.addmonths']에 대한 위키 페이지를보십시오 (http://code.kx.com/q/ref/dotq/#qaddmonths) –

0

그것의 이익을 위해 또 다른 해결책 :

{"d"$1+(-).`month`mm$x}.z.d 
2017.01.01