2016-09-09 2 views
0

전년도가 끝난 후에 매 학년도를 늘리고 싶습니다. 예를 들어 내 현재 코드는 다음과 같습니다새해를 추가하는 방법은 무엇입니까?

WHERE schooldt BETWEEN '07/01/2016' AND '06/30/2017' 

그래서 학교 년에 한 번 내가 자동으로 새로운 시작 날짜와 새 종료 날짜를 설정하려는 06/30/2017 이상이다. 콜드 퓨전에서 dateAdd()를 사용하려고 생각했습니다. 이 작업을 수행 할 수있는 다른 방법이 있습니까? 가장 효율적인 방법은 무엇입니까?

미리 감사드립니다.

+0

내년에 학교가 시작될 때 어떻게 알 수 있습니까? 항상 7 월 1 일에 시작하여 6 월 30 일에 종료합니까? – Alex

+0

예는 항상 07/01에 시작하고 06/30에 끝납니다. 그래서 나는 학년이 끝난 후 첫해와 내년을 늘리고 싶습니다. –

+0

나머지 쿼리는 관련이 있습니다. 게시 해주세요. –

답변

6

나는 이전 학년도가

그런 다음 현재 월을 기준으로 쿼리에 사용 된 날짜 값을 변경하는 로직을 구현

이상 후 학기마다 시간을 증가하고 싶습니다. 이번 달이 7 월보다 빠르면 현재 학년도가 아직 진행 중임을 알 수 있습니다. 따라서 시작 날짜를 계산하려면 1 년을 공제하십시오. 그렇지 않으면 내년으로 이동하십시오.

<cfset today = now()> 
    <!--- If the current school year is still in progress ---> 
    <cfif month(today) lt 7> 
     <cfset startDate = createDate(year(today) - 1, 7, 1)> 
     <cfset endDate = createDate(year(today), 6, 30)> 
    <!--- Otherwise, move to next year ---> 
    <cfelse> 
     <cfset startDate = createDate(year(today), 7, 1)> 
     <cfset endDate = createDate(year(today) + 1, 6, 30)> 
    </cfif> 

는 지금까지 쿼리로, 명심해야 할 두 가지 :

  • 날짜 문자열이 모호하다. 항상 대신 날짜 개체를 사용하십시오.
  • 날짜 비교와 BETWEEN 연산자에주의하십시오. SchoolDt 열에 날짜와 시간이 모두 포함 된 경우 결과가 예상 한 것과 다를 수 있습니다. 더 유연한 구조는 (열이 날짜와 시간이 모두 포함 된 경우에도 스틸 작동하는지)이다

    WHERE SchoolDt >= <cfqueryparam value="#startDate#" cfsqltype="cf_sql_date"> 
    AND SchoolDt < <cfqueryparam value="#dateAdd('d', 1, endDate)#" cfsqltype="cf_sql_date"> 
    

    당신이 new Query()를 사용하는 경우, SQL 문자열을 매개 변수화 대신 addParam를 사용

    yourQuery.addParam(name="startDate" 
            , value="#startDate#" 
            , cfsqltype="cf_sql_date"); 
    
    yourQuery.addParam(name="endDate" 
            , value="#endDate#" 
            , cfsqltype="cf_sql_date"); 
    
날짜 테이블 답변
+0

감사합니다. 이 훌륭한 작품, 나는 dateFormat() 주위에 날짜를 사용합니다. 그게 위의 논리를 바꿀 수있는 것인지 확실하지 않습니다. –

+2

@espresso_coffee - 아니요, dateFormats()는 날짜 * 객체를 문자열로 변환하기 때문에 사용하지 마십시오 (모호합니다). DateFormat은 프레젠테이션 (프레젠테이션)을 위해서만 사용됩니다. 예를 들어 인간에게 친숙한 값을 사용자에게 표시해야하는 경우입니다. 데이터베이스를 사용하거나 날짜 함수를 사용하는 경우 값을 날짜 개체로 둡니다. – Leigh

+0

다시 한번 감사드립니다. 이 쿼리를 사용하여 ArrayAppend()에서 cfqueryparam을 사용해야합니까? –

2

: 그 린 함께

CREATE TABLE calendar ( 
    SeqNum int 
    , schooldt date NOT NULL PRIMARY KEY 
    , theYear int 
    , theMonth tinyint 
    , theDay tinyint 
    , schoolyear int 
    , isSchoolDay tinyint /* Can count schooldays */ 
    , isHoliday tinyint /* Can count holidays. */ 
) 

DECLARE @StartDate date = '1/1/2010' 

/* Build tally table with 10^x rows */ 
; WITH TallyTable (x) AS 
(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) 
    FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(x)  -- 10 days 
    CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(x) -- 100 days 
    CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(x) -- 1000 days 
    CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) d(x) -- 10000 days 
) 
INSERT INTO calendar (SeqNum, schooldt, theYear, theMonth, theDay, schoolyear, isSchoolDay, isHoliday) 
SELECT 
    tt.x AS SeqNum 
    , d1.theDate 
    , d2.theYear 
    , d2.theMonth 
    , d2.theDay 
    , d2.theSchoolYear 
    , 1 , 0 /* Defaults for isSchoolDay and isHoliday. Add if needed. */ 
FROM TallyTable tt 
CROSS APPLY (
    SELECT theDate = DATEADD(dd, (tt.x-1), @StartDate) /* Starting date */ 
) d1 
CROSS APPLY 
( 
    SELECT theYear = DATEPART(yy,d1.theDate) 
     , theMonth = DATEPART(mm,d1.theDate) 
     , theDay = DATEPART(dd,d1.theDate) 
     , theSchoolYear = CASE WHEN DATEPART(mm,d1.theDate) < 7 THEN DATEPART(yyyy,d1.theDate) ELSE DATEPART(yyyy,d1.theDate)+1 END 
) d2; 

뭔가 es는 몇 년 동안의 일 목록을 제공합니다. 그런 다음이 테이블에 가입하여 원하는 범위를 얻을 수 있습니다.

표를 향상 시키려면 공휴일과 주말을 레이블링하는 정보를 포함시켜 학교가 실제로 세션에 참여하는 날만 볼 수 있습니다. 그리고 가장 중요한 것은,보고자하는 현재 학년도까지 모든 것을 걸러 낼 수 있다는 것입니다. 변경할 시간이되면 학년을 늘리는 것에 대해 걱정할 필요가 없습니다.

하지만이 질문에 대한 궁극적 인 목표는 무엇입니까? 궁극적 인 목표를 달성하는 더 좋은 방법이있을 수 있습니다.

관련 문제