2012-12-21 2 views
2

이 필요성은 조금 이상합니다. C#에서는 할 수 있지만 보고서 디자이너에서는 표현식 구문을 올바르게 가져올 수 없습니다.달의 첫 번째 토요일과 지난 주 마지막 금요일의 가져 오기

보고서의 기본 시작 및 종료 매개 변수를 설정하려고합니다. 이렇게하려면 한 달의 첫 번째 토요일에 대한 "날짜 전용"값과 그 달의 마지막 주에 대한 금요일 날짜가 필요합니다. 이것은 후자의 가치가 다음 달에 실제로 올 수 있음을 의미합니다.

STARTDATE : 2012년 10월 6일 종료 날짜 : 2012년 11월 2일

STARTDATE : 2012년 11월 3일 종료 날짜 : 2012년 11월 30일

그래서 2012 년, 제 값은 다음과 같을 것

STARTDATE : 2012년 12월 1일 종료 날짜 : 나는 달()를 사용하여 조건문과 협력 한 2013년 1월 4일

, 평일() 등 WeekdayName하지만 행운을 가지고 있지. 이런 일을 한 사람 있습니까?

+0

Visual Studio Report Designer를 모르지만 End 매개 변수를 다음과 같이 정의 할 수도 있습니다. : "지난 토요일 ** ** 6 일". 또한 '지난 달의 금요일'또는 '다음 달 6 일 전 또는 그 이전'입니다. 그게 도움이되는지 모르십니까? –

답변

1

무거운 조건문은 필요하지 않습니다. 루프 및 기타 명령형 프로그래밍 기능을 시뮬레이트하기 위해 수행하는 경우 Custom Code에 함수를 작성하는 것이 더 쉽습니다.

대용 암호는 수행중인 특정 계산에 대한 알고리즘을 찾는 것입니다. 예를 들어 this answer은 약간의 조정만으로 필요한 날짜를 얻기위한 훌륭한 기초가 될 수 있습니다. 이 달의 1 일의 주

  1. 일 : : 여기 "첫 번째 토요일이 달의"작동 할 방법

    =Weekday(DateAdd("d", 1 - Now().Day, Now()), FirstDayOfWeek.Sunday) 
    
  2. 며칠해야 매월 첫날에

    =7 - Weekday(DateAdd("d", 1 - Now().Day, Now()), FirstDayOfWeek.Sunday) 
    
  3. 그래서 첫 번째 토요일의 날짜 달의 urday은 다음과 같습니다

    =DateAdd("d", 
        7 - Weekday(DateAdd("d", 1 - Now().Day, Now()), FirstDayOfWeek.Sunday), 
        DateAdd("d", 1 - Now().Day, Now()) 
        ) 
    

이 작업을 수행하는 경우에도 스마트 한 방법은 아마이 있으며, VBScript를이 이 조금이라도 제한 있습니다 연산 식하지만. 위의 예제는 "달의 마지막 주 금요일"을 얻기 위해 조정될 수 있습니다.

결론 : 당신이 표현의 루프와 물건을 할 수 없기 때문에 질문에 (간접하지만, 일반) 대답은, 가능한 한 선언적으로 (당신의 원하는 날짜에 도착하는 알고리즘에 대해 생각하는 것입니다 용이하게).

+1

Jeroen, 그것을 체계적으로 통과 해 주셔서 감사합니다. 그것은 당신이 그것을 통해 당신의 방법을 추론하는 방법을 볼 수있었습니다. 같은 접근법을 사용하여 종료일을 얻을 수도 있습니다. – DJGray

+0

저는 SQL이 아닌 다른 코더가 아닙니다. FirstDayOfWeek 명령을 알지 못했습니다. 답변 해주셔서 감사합니다. – Neil

1

다음은 첫 번째 부분입니다. 이 작업을 수행하는 데 훨씬 좋은 방법이있을 것입니다. 내가 한 일은 당월에 한 달을 빼앗아갔습니다. 그런 다음 날짜와 현재 연도를 연결합니다. 그런 다음 토요일인지 확인하기 위해 하루의 이름을 확인했습니다. 만약 그렇다면, 나는 그 날짜를 사용했다. 그렇지 않으면 나는 같은 수표로 그 다음날을했다. 이 기능을 사용하려면 1 월에 추가 로직을 추가해야합니다. 또한 NOW() 대신 사용중인 매개 변수를 사용하십시오. 다른 주에

=IIF(WeekdayName(DatePart("w", (CDate((Month(NOW()) - 1) & "/1/" & YEAR(NOW()))))) = "Saturday", (CDate((Month(NOW()) - 1) & "/1/" & YEAR(NOW()))), 
(IIF(WeekdayName(DatePart("w", (CDate((Month(NOW()) - 1) & "/2/" & YEAR(NOW()))))) = "Saturday", (CDate((Month(NOW()) - 1) & "/2/" & YEAR(NOW()))), 
    (IIF(WeekdayName(DatePart("w", (CDate((Month(NOW()) - 1) & "/3/" & YEAR(NOW()))))) = "Saturday", (CDate((Month(NOW()) - 1) & "/3/" & YEAR(NOW()))), 
     (IIF(WeekdayName(DatePart("w", (CDate((Month(NOW()) - 1) & "/4/" & YEAR(NOW()))))) = "Saturday", (CDate((Month(NOW()) - 1) & "/4/" & YEAR(NOW()))), 
      (IIF(WeekdayName(DatePart("w", (CDate((Month(NOW()) - 1) & "/5/" & YEAR(NOW()))))) = "Saturday", (CDate((Month(NOW()) - 1) & "/5/" & YEAR(NOW()))), 
       (IIF(WeekdayName(DatePart("w", (CDate((Month(NOW()) - 1) & "/6/" & YEAR(NOW()))))) = "Saturday", (CDate((Month(NOW()) - 1) & "/6/" & YEAR(NOW()))), 
        (IIF(WeekdayName(DatePart("w", (CDate((Month(NOW()) - 1) & "/7/" & YEAR(NOW()))))) = "Saturday", (CDate((Month(NOW()) - 1) & "/7/" & YEAR(NOW()))), 
"1/1/2010"))))))))))))) 

, 당신은 SQL Server의 달력 테이블이있는 경우 (특히 당신이 금요일 필요로 할 때를 위해)이 얻을 수있는 아주 쉬운 방법이있을 것입니다. 다음과 같은 간단한 select 문을 수행 할 수 있습니다.

SELECT 
    MIN(date) 
FROM 
    calendar c 
WHERE 
    MONTH(DATEADD("m", -1, GETDATE())) = MONTH(date) 
    AND YEAR(DATEADD("m", -1, GETDATE())) = YEAR(date) 
    AND datename(dw, date) = 'Saturday' 
+1

닐, 도움이되는 답장을 보내 주셔서 감사합니다. 나는 중첩 된 IIF를했지만 결코 그렇게 많이하지 않았다! ;-) – DJGray

+0

둘 다 감사합니다 (Neil and Jeroen). 저는 지난 달 마지막 주 첫째 토요일과 금요일에 당신의 예를 맛보기 위해 마사지했습니다. (항상 우리는 한 달 동안 화폐로 계산서를 청구합니다.) 저는 두 가지 문제가 있었고 각 문제를 해결하기 위해 샘플 코드를 사용했기 때문에 두 가지 대답을 모두 답변으로 선택하고 싶습니다. – DJGray

-1

수있는 마지막 달의 마지막 금요일 .....

= DateAdd 함수 (DateInterval.Day - 평일 (DateAdd 함수 ("D"- 1. 지금은() 일, 이제()) , FirstDayOfWeek.Saturday), DateSerial (Year (Date.Now), Month (Date.Now), 1))