반응형

출처 :  https://ntalbs.github.io/2010/postgresql-date/

 

 

간단한 날짜 관련 함수 및 날짜 연산:

-- 오늘 (date) select current_date; -- 현재시각 (timestamp) select now(); select current_timestamp; -- 어제/오늘/내일 select current_date - 1 "어제", current_date "오늘", current_date + 1 "내일" ; -- day of week select extract(dow from current_date); -- 일요일(0) ~ 토요일(6) select extract(isodow from current_date); -- 월요일(1) ~ 일요일(7) -- day of year select extract(doy from current_date); -- week of year select extract(week from current_date); -- 두 날짜 사이의 날수 select '2010-07-05'::date - '2010-06-25'::date;

한 주의 첫날, 마지막 날 구하기:

-- (주 첫 날을 월요일로 할 때 주) 첫날, 마지막 날 -- date_trunc() 함수의 리턴 타입은 timestamp임 -- 이번 주 select date_trunc('week', current_date)::date "이번 주 첫날", date_trunc('week', current_date)::date+6 "이번 주 마지막 날" ; -- 전 주 select date_trunc('week', current_date-7)::date "전 주 첫날", date_trunc('week', current_date-7)::date+6 "전주 마지막 날" ; -- 다음 주 select date_trunc('week', current_date+7)::date "다음 주 첫날", date_trunc('week', current_date+7)::date+6 "다음주 마지막 날" ; -- (주 첫 날을 일요일로 할 때) 주 첫날/마지막 날 -- week로 date_trunc를 하는 경우 결과가 월요일 날짜가 되기 때문에 -- 한 주를 일요일~토요일까지로 하는 경우는 -1 필요 -- 이번 주 select date_trunc('week', current_date)::date-1 "이번 주 첫날", date_trunc('week', current_date)::date+6-1 "이번 주 마지막 날" ; -- 전 주 select date_trunc('week', current_date-7)::date-1 "전 주 첫날", date_trunc('week', current_date-7)::date+6-1 "전주 마지막 날" ; -- 다음 주 select date_trunc('week', current_date+7)::date-1 "다음 주 첫날", date_trunc('week', current_date+7)::date+6-1 "다음주 마지막 날" ;

한 달의 첫날, 마지막 날 구하기:

-- 한 달 전/후 날짜 select current_date - interval '1 months' "전 달", current_date + interval '1 months' "다음 달" ; -- 이번 달 첫날, 마지막 날 select date_trunc('month', current_date)::date "첫날", date_trunc('month', current_date + interval '1 months')::date - 1 "마지막 날" ; -- 전달 첫날, 마지막 날 select date_trunc('month', current_date - interval '1 months')::date "첫 날", date_trunc('month', current_date)::date - 1 "마지막 날" ; -- 다음 달 첫날, 마지막 날 select date_trunc('month', current_date + interval '1 months')::date "첫 날", date_trunc('month', current_date + interval '2 months')::date - 1 "마지막 날" ;

이번 주 첫날부터 마지막 날까지 날짜들:

-- 이번 주 날짜 select date_trunc('week', current_date)::date -1 + i "일~토", date_trunc('week', current_date)::date + i "월~일" from generate_series(0,6) as t(i);

이번 달 첫날부터 마지막 날까지 날짜들:

generate_series() 함수를 사용한다. 한 달이 28일, 29일, 30일, 31일 중 어떤 것이 될지 알 수 없기 때문에 월의 마지막날을 구해 generate_series()의 두번째 인수로 넣어준다.

-- 이번 달 날짜 (첫날 ~ 마지막 날) select date_trunc('month', current_date)::date + (i - 1) from generate_series( 1, extract(day from date_trunc('month', current_date + interval '1 months')::date - 1)::integer ) as t(i); select date_trunc('month', current_date)::date + (i - 1) from generate_series( 1, extract(day from date_trunc('month', current_date) + interval '1 months' - interval '1 days')::integer ) as t(i);

week of month:

이번 달의 첫날부터 마지막 날까지의 날짜와 week of month를 구하는 쿼리인데, 1일~7일까지는 첫째 주, 8일~14일까지는 둘째 주와 같은 식으로 된다. 역시 generate_series() 함수를 사용했다. 위와 같이 첫 날과 마지막 날의 차를 구해 수열을 만들지 않고, 0~30까지 만들어 무조건 더하면서 이번 달에 속하는 날짜만 WHERE 조건으로 추려내게 했다.

select dt, to_char(dt, 'W') "day of week" from ( select date_trunc('month', current_date)::date + i dt from generate_series(0, 30) as t(i) ) t where extract(month from dt) = extract(month from current_date) ;

PostgreSQL 매뉴얼 참조 URL:

http://www.postgresql.org/docs/8.4/interactive/functions-datetime.html http://www.postgresql.org/docs/8.4/interactive/functions-formatting.html

반응형

'Postgresql' 카테고리의 다른 글

postgresql 시간 - 시간  (0) 2019.06.03
MONTHS_BETWEEN ORACLE -> POSTGRESQL 변경하기  (0) 2019.04.01
코드 4자리로 뽑기  (0) 2019.02.26
Oracle INSTR 함수 -> position 변경  (0) 2019.01.28
Postgresql Merge into  (0) 2019.01.28
반응형

var radio = document.getElementsByName("radioBtn");
      var radio_value; 
      for(var i=0; i<radio.length; i++) {
          if(radio[i].checked) {
           radio_value = radio[i].value;
          }
      }

반응형
반응형

function oneCheckbox(){
        var obj = document.getElementsByName("checkbox");
        for(var i=0; i<obj.length; i++){
            if(obj[i] != a){
                obj[i].checked = false;
            }
        }

반응형
반응형

1. 현재 주간current week의 첫번째 날TRUNC(sysdate,'IW')

 

2. 이전 주간prior week의 첫번째 날TRUNC(sysdate-7,'IW')

 

3. 다음 주간next week의 첫번째 날NEXT_DAY(sysdate,'MONDAY')

 

4. 현재 달current month의 첫번째 날TRUNC(sysdate,'MM')

 

5. 이전 달prior month의 첫번째 날ADD_MONTHS( TRUNC(sysdate,'MM'), -1 )

 

6. 다음 달next month의 첫번째 날ADD_MONTHS( TRUNC(sysdate,'MM'), 1 )

 

7. 현재 달current month의 마지막 날LAST_DAY(sysdate)

 

 

출처 : https://jdm.kr/blog/71

반응형

'Oracle' 카테고리의 다른 글

oracle 천단위(3자리) 콤마  (1) 2019.07.26
Oracle %ROWTYPE  (0) 2019.07.03
해당 날짜의 일요일 구하기  (0) 2019.04.02
Oracle Characterset  (1) 2019.01.03
Oracle 테이블 컬럼 추가  (0) 2018.12.27
반응형

SELECT  TRUNC(TO_DATE('20190402', 'YYYYMMDD'), 'iw') FROM dual;

 

반응형

'Oracle' 카테고리의 다른 글

Oracle %ROWTYPE  (0) 2019.07.03
오라클 월 처음&마지막 날짜 구하기  (0) 2019.04.25
Oracle Characterset  (1) 2019.01.03
Oracle 테이블 컬럼 추가  (0) 2018.12.27
날짜 기간 조회  (0) 2018.12.27
반응형

oracle

 

select MONTHS_BETWEEN(TO_DATE('20190401','YYYYMMDD'),TO_DATE('20190101','YYYYMMDD')) FROM dual;  

 

 

 

 

postgresql 

 

SELECT EXTRACT(YEAR FROM AGE(TIMESTAMP '2013-12-11', TIMESTAMP '2010-09-17')) * 12 +
              EXTRACT(MONTH FROM AGE(TIMESTAMP '2013-12-11', TIMESTAMP '2010-09-17'));

 

 

출처 :http://www.sqlines.com/postgresql-to-oracle/get_interval_in_months

 

Get Interval In Months - PostgreSQL to Oracle Migration - SQLines Open Source Tools

In PostgreSQL, you can use EXTRACT and AGE functions to get the interval between 2 timestamps in months. PostgreSQL: -- AGE function returns year-month-day interval between 2 timestamps SELECT AGE(TIMESTAMP '2013-03-11 00:00:00', TIMESTAMP '2010-09-17 00:0

www.sqlines.com

 

 

 

In PostgreSQL, you can use EXTRACT and AGE functions to get the interval between 2 timestamps in months.

PostgreSQL:

-- AGE function returns year-month-day interval between 2 timestamps SELECT AGE(TIMESTAMP '2013-03-11 00:00:00', TIMESTAMP '2010-09-17 00:00:00'); # 2 years 5 mons 24 days

Now you can extract years, multiple by 12 and extract months to get the interval in months:

-- Get interval in months SELECT EXTRACT(YEAR FROM AGE(TIMESTAMP '2013-03-11', TIMESTAMP '2010-09-17')) * 12 + EXTRACT(MONTH FROM AGE(TIMESTAMP '2013-03-11', TIMESTAMP '2010-09-17')); # 29

Using EXTRACT in Oracle

In Oracle you can use datetime arithmetic subtraction operator - instead of AGE function to get the interval between 2 timestamps:

Oracle:

-- Subtraction operator - returns interval (DAY TO SECOND by default) SELECT TIMESTAMP '2013-03-11 00:00:00' - TIMESTAMP '2010-09-17 00:00:00' FROM dual; # +000000906 00:00:00.000000000   -- Convert to YEAR TO MONTH interval SELECT (TIMESTAMP '2013-03-11 00:00:00' - TIMESTAMP '2010-09-17 00:00:00') YEAR TO MONTH FROM dual; # +02-06

Note that the interval was rounded to 2 years 6 months when converted to YEAR TO MONTH interval in Oracle, while the actual interval is 2 years, 5 months and 24 days. 

Using EXTRACT function you can get interval between 2 timestamps in months:

-- Get interval in months SELECT EXTRACT(YEAR FROM (TIMESTAMP '2013-03-11 00:00:00' - TIMESTAMP '2010-09-17 00:00:00') YEAR TO MONTH) * 12 + EXTRACT(MONTH FROM (TIMESTAMP '2013-03-11 00:00:00' - TIMESTAMP '2010-09-17 00:00:00') YEAR TO MONTH) FROM dual; # 30

You can see that using EXTRACT in PostgreSQL and Oracle brings different results as Oracle rounds the month part.

Using MONTHS_BETWEEN In Oracle

Oracle provides the built-in function MONTHS_BETWEEN to get the number of months between 2 timestamp and date values:

Oracle:

-- MONTHS_BETWEEN returns a decimal number SELECT MONTHS_BETWEEN(TIMESTAMP '2013-03-11 00:00:00', TIMESTAMP '2010-09-17 00:00:00') FROM dual; # 29.8064516   -- Use FLOOR function to get the same result as PostgreSQL SELECT FLOOR(MONTHS_BETWEEN(TIMESTAMP '2013-03-11 00:00:00', TIMESTAMP '2010-09-17 00:00:00')) FROM dual; # 29

반응형

'Postgresql' 카테고리의 다른 글

postgresql 시간 - 시간  (0) 2019.06.03
postgresql 날짜 연산  (0) 2019.05.10
코드 4자리로 뽑기  (0) 2019.02.26
Oracle INSTR 함수 -> position 변경  (0) 2019.01.28
Postgresql Merge into  (0) 2019.01.28
반응형

예전에 회사를 다니면서 했던 작업중에 주기적으로 DB를 백업하거나 특정시간이

되면 타 시스템에 접속하여 데이터를 가져오거나 새벽 시간에 메일을 보낸다거나 할때

사용했던것 Linux에 Cron(크론탭 이라고했음) 이였다. 크론탭을 등록하고 Java로

프로그램 하여 처리 했었는데 크론탭을 설정할때 java path설정하고 java lib를 로드하고

하려면 조금은 번거로웠었다. Spring에 Timer나 Quartz가 있지만, 내가 봤을때 손쉽게

설정하고 써먹기 좋은게 Task Scheduler 라서 사용방법을 알아보도록 하겠다.


1. XML설정

 - 현재 egov-com-servlet.xml 설정 일부 

   (옵션이 있지만 옵션은 검색을 통해서 찾아보기 바란다.)

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:context="http://www.springframework.org/schema/context"
  3. xmlns:p="http://www.springframework.org/schema/p"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xmlns:task="http://www.springframework.org/schema/task"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
  8. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
  9. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
  10. http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd">
  11. <context:component-scan base-package="egovframework">
  12. <context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
  13. <context:exclude-filter expression="org.springframework.stereotype.Service" type="annotation"/>
  14. <context:exclude-filter expression="org.springframework.stereotype.Repository" type="annotation"/>
  15. </context:component-scan>
  16. <!-- Activates @Scheduled and @Async annotations for scheduling -->
  17. <task:annotation-driven />



2. java 코드 작성

- 3초마다 실행되게 설정

 (크론 expression 설정방법은 하단에 기재)

  1. @Component
  2. public class BlogTask {
  3. @Resource(name="tagService")
  4. private TagService tagService;
  5. @Resource(name="counterService")
  6. private CounterService counterService;
  7. private static final Logger LOGGER = LoggerFactory.getLogger(BlogTask.class);
  8. /**
  9. * @desc : Task Scheduler Test
  10. */
  11. @Scheduled(cron="0/3 * * * * *")
  12. public void taskSchedulerTest() {
  13. LOGGER.debug("taskSchedulerTest - TASK START ");
  14. try {
  15. LOGGER.debug("taskSchedulerTest - Job!!");
  16. LOGGER.debug("taskSchedulerTest - Succ");
  17. } catch (Exception ex) {
  18. ex.printStackTrace();
  19. LOGGER.debug("taskSchedulerTest - Fail");
  20. }
  21. LOGGER.debug("taskSchedulerTest - TASK END ");
  22. }
  23. }


- 로그확인 3초마다 실행된 로그가 찍혔다.

  1. 2016/08/23 10:33:48,001 [pool-1-thread-1] DEBUG egovframework.blog.task.BlogTask - taskSchedulerTest - TASK START
  2. 2016/08/23 10:33:48,001 [pool-1-thread-1] DEBUG egovframework.blog.task.BlogTask - taskSchedulerTest - Job!!
  3. 2016/08/23 10:33:48,001 [pool-1-thread-1] DEBUG egovframework.blog.task.BlogTask - taskSchedulerTest - Succ
  4. 2016/08/23 10:33:48,001 [pool-1-thread-1] DEBUG egovframework.blog.task.BlogTask - taskSchedulerTest - TASK END
  5. 2016/08/23 10:33:51,001 [pool-1-thread-1] DEBUG egovframework.blog.task.BlogTask - taskSchedulerTest - TASK START
  6. 2016/08/23 10:33:51,001 [pool-1-thread-1] DEBUG egovframework.blog.task.BlogTask - taskSchedulerTest - Job!!
  7. 2016/08/23 10:33:51,001 [pool-1-thread-1] DEBUG egovframework.blog.task.BlogTask - taskSchedulerTest - Succ
  8. 2016/08/23 10:33:51,001 [pool-1-thread-1] DEBUG egovframework.blog.task.BlogTask - taskSchedulerTest - TASK END
  9. 2016/08/23 10:33:54,001 [pool-1-thread-1] DEBUG egovframework.blog.task.BlogTask - taskSchedulerTest - TASK START
  10. 2016/08/23 10:33:54,001 [pool-1-thread-1] DEBUG egovframework.blog.task.BlogTask - taskSchedulerTest - Job!!
  11. 2016/08/23 10:33:54,001 [pool-1-thread-1] DEBUG egovframework.blog.task.BlogTask - taskSchedulerTest - Succ
  12. 2016/08/23 10:33:54,001 [pool-1-thread-1] DEBUG egovframework.blog.task.BlogTask - taskSchedulerTest - TASK END


이제 쉽게 스케쥴러를 사용하실 수 있습니다.


[참고] Cron 표현식

 순서

필드명

사용 가능한 값

 1

 seconds

 0~59 , - * /

 2

 minutes

 0~59 , - * /

 3

 hours

 0~23 , - * /

 4

 day of month

 1~31 , - * ? / L W

 5

 month

 1~12 or JAN-DEC , - * /

 6

 day of week

 1-7 or SUN-SAT , - * ? / L #

 7

 years (optional)

 1970~2099 , - * /

 

특수문자의 의미

 기호

의미 

 사용 예

 *

 모든 수를 의미

seconds에서 사용하면 매초, minutes에서 사용하면 매분, hours에서 사용하면 매시간 

 ?

 해당 항목을 사용하지 않음

day of month에서 사용하면 월중 날짜를 지정하지 않음. day of week에서 사용하면 주중 요일을 지정하지 않음 

 -

 기간을 설정

hours에서 10-12이면 10시, 11시, 12시에 동작

minutes에서 58-59이면 58분, 59분에 동작

 ,

특정 시간을 지정

day of week에서 2,4,6이면 월,수,금에만 동작함

 /

시작시간과 반복 간격 설정

seconds위치에 0/15로 설정하면 0초에 시작해서 15초 간격으로 동작 

minutes위치에 5/10으로 설정하면 5분에 시작해서 10분 간격으로 동작

 L

마지막 기간에 동작

day of month, day of week에서만 사용

day of month에서 사용하면 해당월 마지막 날에 수행

day of week에서 사용하면 토요일에 수행

 W

가장 가까운 평일 동작

day of month에만 사용 

15W로 설정하면 15일이 토요일이면 가장 가까운 14일 금요일에 실행

15W로 설정하고 15일이 일요일이면 16일에 실행

15W로 설정하고 15일이 평일이면 15일에 실행

 LW

L과 W의 조합 

그달의 마지막 평일에 동작 

 #

몇 번째 주와 요일 설정

day of week에 사용 

6#3이면 3 번째 주 금요일에 동작 

4#2이면 2번째 주 수요일에 동작

 

사용 예

 표현식

의미 

 0 0 12 * * *

매일 12시에 실행 

 0 15 10 * * *

매일 10시 15분에 실행 

 0 * 14 * * *

매일 14시에 0분~59분까지 매분 실행

 0 0/5 14 * * *

매일 14시에 시작해서 5분 간격으로 실행 

 0 0/5 14,18 * * *

매일 14시, 18시에 시작해서 5분 간격으로 실행 

 0 0-5 14 * * *

매일 14시에 0분, 1분, 2분, 3분, 4분, 5분에 실행 

 0 0 20 ? * MON-FRI

월~금일 20시 0분 0초에 실행 

 0 0/5 14 * * ?

아무요일, 매월, 매일 14:00부터 14:05분까지 매분 0초 실행 (6번 실행됨)

 0 15 10 ? * 6L

 매월 마지막 금요일 아무날이나 10:15:00에 실행

 0 15 10 15 * ?

아무요일, 매월 15일 10:15:00에 실행 

 * /1 * * * *

매 1분마다 실행

 * /10 * * * *

매 10분마다 실행 

 

 

 

이전 Task와 Delay 설정

 표현

의미 

 fixed-delay

 이전에 실행된 task의 종료시간으로부터 정의된 시간만큼 지난 후 다음 task를 실행

밀리세컨드 단위

 fixed-rate

 이전에 실행된 task의 시작 시간으로부터 정의된 시간만큼 지난 후 다음 task를 실행

밀리세컨드 단위




출처  : http://webprogramer.kr/blog/P000000289/post.do

반응형

'JAVA' 카테고리의 다른 글

Duration, Period, chronoUnit 사용법  (0) 2022.09.16
접근제어자 범위  (0) 2021.04.09
JAVA 메일 보내기 글자 깨짐현상  (0) 2019.02.27
파일 업로드 목록, 다운로드  (0) 2019.02.11
JAVA 업로드 된 파일 삭제하기  (0) 2019.02.11
반응형

[Java] Gmail SMTP를 이용한 메일 보내기 [보기]



종종 smtp를 이용할때 한글이 깨지는 경우가 있는데 한글깨짐이 발생하는곳은 3가지 정도이다.


1. 발신자 이름 - 예) 홍길동<test@gmail.com>
2. 메일 제목
3. 본문 내용



이중에서 메일 제목과 본문 내용은 쉽게 해결이 가능한데, 
발신자 이름의 경우 해결방법을 못 찾아서 아예 사용하지 않거나, 영어로 사용하는 사람도 봤다.

(사실 꼬꼬마 시절에 내가 그랬다)

아마도 쉽게 찾지 못하는 사람은 제목, 본문과 동일하게 캐릭터셋을 사용 하려다보니 문제 해결을 못한게 아닌가 싶다.

일단 한글을 해결할 수 있는 소스코드를 잠깐 살펴보자. 전체 소스코드는 지난번 포스팅 내용을 참고하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
MimeMessage msg = new MimeMessage(session);
 
    String charSet = "UTF-8" ;
 
    try{
        //편지보낸시간
        msg.setSentDate(new Date());
 
        String fromName = "홍길동" ;
        InternetAddress from = new InternetAddress() ;
 
        // 발시자 이름 : 홍길동<test@gmail.com>
        try{
            from = new InternetAddress(new String(fromName.getBytes(charSet), "8859_1") + "<test@gmail.com>");
        }catch(UnsupportedEncodingException uee){
            uee.printStackTrace();
        }
        // 이메일 발신자
        msg.setFrom(from);
 
 
        // 이메일 수신자
        InternetAddress to = new InternetAddress("test@naver.com");
        msg.setRecipient(Message.RecipientType.TO, to);
 
        // 이메일 제목
        msg.setSubject("메일 전송 테스트", charSet);
 
        // 이메일 내용
        msg.setText("내용", charSet);
 
        // 이메일 헤더
        msg.setHeader("content-Type", "text/html");
 
        //메일보내기
        javax.mail.Transport.send(msg);
 
    }catch (AddressException addr_e) {
        addr_e.printStackTrace();
    }catch (MessagingException msg_e) {
        msg_e.printStackTrace();
    }


코드를 보면 알겠지만 결국은 발신자 이름의 언어셋을 "UTF-8" 로 지정하는것이 아닌 "8859_1" 로 지정하는것이다.



출처: https://fruitdev.tistory.com/27 [과일가게 개발자]

반응형

'JAVA' 카테고리의 다른 글

접근제어자 범위  (0) 2021.04.09
@Scheduled 쉽게 사용하기  (0) 2019.03.07
파일 업로드 목록, 다운로드  (0) 2019.02.11
JAVA 업로드 된 파일 삭제하기  (0) 2019.02.11
파일이름을 시간으로 변경하여 저장  (0) 2019.01.23
반응형

(SELECT LTRIM(TO_CHAR((COALESCE(MAX(CODE),'0')::integer)+1,'0000')) FROM tabe);

반응형

'Postgresql' 카테고리의 다른 글

postgresql 날짜 연산  (0) 2019.05.10
MONTHS_BETWEEN ORACLE -> POSTGRESQL 변경하기  (0) 2019.04.01
Oracle INSTR 함수 -> position 변경  (0) 2019.01.28
Postgresql Merge into  (0) 2019.01.28
Postgresql 외부 접속 허용  (0) 2019.01.15

+ Recent posts