본문 바로가기
VB.NET&MSSQL

[MS-SQL] SQL 날짜 함수

by TobeDalin 2020. 4. 27.
반응형

MS-SQL SQL 날짜 함수

SQL SERVER에서 날짜 함수에는 어떤 것이 있는지 보겠습니다.

SQL SERVER에서 DB 접속하고,  Programmability> Function > stystem Functions > Date and Time functions 에서 확인 할 수 있습니다.
 

주로 사용되는 함수는  

Dateadd() 

Datediff() 

Datename() 

Datepart()  

Day() 

Month() 

Year() 

isdate() 

  

정도입니다. 

 

 

 
실무 사용 예제

SELECT WORK_NO, SALES_ORDER_IDX, B.LINE_ID, B.PLAN_QTY, B.PERIOD
, CASE WHEN DATEPART(MONTH,B.PROD_START_DATE) = DATEPART(MONTH, @YYYY +'-'+@MM +'-01' ) THEN  DATEPART(DAY,B.PROD_START_DATE) ELSE DATEPART(DAY,@YYYY +'-'+@MM +'-01' ) END THISMMSTART
, CASE WHEN DATEPART(MONTH,B.PROD_END_DATE) = DATEPART(MONTH, @YYYY +'-'+@MM +'-01' ) THEN  DATEPART(DAY,B.PROD_END_DATE) ELSE DATEPART(DAY,@YYYY +'-'+@MM +'-01' ) END THISMMEND
, DATEPART(dw,CASE WHEN DATEPART(MONTH,B.PROD_START_DATE) = DATEPART(MONTH, @YYYY +'-'+@MM +'-01' ) THEN  DATEPART(DAY,B.PROD_START_DATE) ELSE DATEPART(DAY,@YYYY +'-'+@MM +'-01' ) END) STARTDAYSNO
, DATEPART(dw,CASE WHEN DATEPART(MONTH,B.PROD_END_DATE) = DATEPART(MONTH, @YYYY +'-'+@MM +'-01' ) THEN  DATEPART(DAY,B.PROD_END_DATE) ELSE DATEPART(DAY,@YYYY +'-'+@MM +'-01' ) END) ENDDAYSNO
, CONVERT(CHAR(10),B.PROD_START_DATE,112) AS PROD_START_DATE,CONVERT(CHAR(10), B.PROD_END_DATE,112) AS  PROD_END_DATE
FROM (  
SELECT WORK_NO, SALES_ORDER_IDX, B.LINE_ID, B.PLAN_QTY, B.PERIOD, 
iif(prod_start_date < CONVERT(DATE, @YYYY +'-'+@MM +'-01'), CONVERT(DATE, @YYYY +'-'+@MM +'-01'),prod_start_date) AS prod_start_date, 
iif(prod_end_date >  DATEADD(MONTH,1, CONVERT(DATE, @YYYY +'-'+@MM +'-01')), DATEADD(MONTH, 1, DATEADD(DAY,-1, CONVERT(DATE, @YYYY +'-'+@MM +'-01'))),prod_end_date) AS  prod_end_date
FROM DBO.WORK_DIVIDE_P B
WHERE B.PROD_START_DATE BETWEEN CONVERT(DATE, @YYYY +'-'+@MM +'-01')  AND   DATEADD(MONTH, 1, DATEADD(DAY,-1, CONVERT(DATE, @YYYY +'-'+@MM +'-01')))
OR B.PROD_END_DATE      BETWEEN CONVERT(DATE, @YYYY +'-'+@MM +'-01') AND DATEADD(MONTH, 1, DATEADD(DAY,-1, CONVERT(DATE, @YYYY +'-'+@MM +'-01')))

) B

 

 

다국가 날짜포맷을 지원해야 하는 경우

해당월의 마지막날구하기.

SELECT CONVERT(DATE, CONVERT(VARCHAR(4), DATEPART(YEAR, GETDATE()))  +'-'

+ IIF(LEN(CONVERT(VARCHAR, DATEPART(MONTH, GETDATE()))) = 1, '0'+CONVERT(VARCHAR, DATEPART(MONTH, GETDATE())), CONVERT(VARCHAR, DATEPART(MONTH, GETDATE())))
+'-'+ '01')

 

SELECT DATEADD(DAY, -1, CONVERT(DATE, CONVERT(VARCHAR(4), DATEPART(YEAR, GETDATE()))  +'-'

+ IIF(LEN(CONVERT(VARCHAR, DATEPART(MONTH, GETDATE()))) = 1, '0'+CONVERT(VARCHAR, DATEPART(MONTH, GETDATE())), CONVERT(VARCHAR, DATEPART(MONTH, GETDATE()))) 
+'-'+ '01'))

 

MSSQL 문제 시작일 종료일의 월차이가 2 이상이면서 시작월이 202002월이고, 종료일이 202004월일때,  202003월로 조회했을 때 결과에 포함 시켜야 합니다.

 

 

SELECT WORK_NO, SALES_ORDER_IDX, B.LINE_ID, B.PLAN_QTY, B.PERIOD 
, CASE WHEN DATEPART(MONTH,B.PROD_START_DATE) = DATEPART(MONTH, @YYYY +'-'+@MM +'-01' ) THEN  DATEPART(DAY,B.PROD_START_DATE) ELSE DATEPART(DAY,@YYYY +'-'+@MM +'-01' ) END THISMMSTART 
, CASE WHEN DATEPART(MONTH,B.PROD_END_DATE) = DATEPART(MONTH, @YYYY +'-'+@MM +'-01' ) THEN  DATEPART(DAY,B.PROD_END_DATE) ELSE DATEPART(DAY,@YYYY +'-'+@MM +'-01' ) END THISMMEND 
, DATEPART(dw,CASE WHEN DATEPART(MONTH,B.PROD_START_DATE) = DATEPART(MONTH, @YYYY +'-'+@MM +'-01' ) THEN  DATEPART(DAY,B.PROD_START_DATE) ELSE DATEPART(DAY,@YYYY +'-'+@MM +'-01' ) END) STARTDAYSNO 
, DATEPART(dw,CASE WHEN DATEPART(MONTH,B.PROD_END_DATE) = DATEPART(MONTH, @YYYY +'-'+@MM +'-01' ) THEN  DATEPART(DAY,B.PROD_END_DATE) ELSE DATEPART(DAY,@YYYY +'-'+@MM +'-01' ) END) ENDDAYSNO 
, CONVERT(CHAR(10),B.PROD_START_DATE,112) AS PROD_START_DATE,CONVERT(CHAR(10), B.PROD_END_DATE,112) AS  PROD_END_DATE 
FROM (   
SELECT WORK_NO, SALES_ORDER_IDX, B.LINE_ID, B.PLAN_QTY, B.PERIOD,  
iif(prod_start_date < CONVERT(DATE, @YYYY +'-'+@MM +'-01'), CONVERT(DATE, @YYYY +'-'+@MM +'-01'),prod_start_date) AS prod_start_date,  
iif(prod_end_date >  DATEADD(MONTH,1, CONVERT(DATE, @YYYY +'-'+@MM +'-01')), DATEADD(MONTH, 1, DATEADD(DAY,-1, CONVERT(DATE, @YYYY +'-'+@MM +'-01'))),prod_end_date) AS  prod_end_date 
FROM DBO.WORK_DIVIDE_P B 
WHERE B.PROD_START_DATE BETWEEN CONVERT(DATE, @YYYY +'-'+@MM +'-01')  AND   DATEADD(MONTH, 1, DATEADD(DAY,-1, CONVERT(DATE, @YYYY +'-'+@MM +'-01'))) 
OR B.PROD_END_DATE      BETWEEN CONVERT(DATE, @YYYY +'-'+@MM +'-01') AND DATEADD(MONTH, 1, DATEADD(DAY,-1, CONVERT(DATE, @YYYY +'-'+@MM +'-01'))) 

) B

 

수정 SQL

--MSSQL 문제 시작일 종료일의 월차이가 2 이상이면서 시작월이 202002월이고, 종료일이 202004월일때, 202003월로 조회했을 때 결과에 포함 시켜야 합니다. 
--조회 하는 월이 2월인 경우 
--시작은 2월보다 작거나 같고, 
--종료는 2월보다 크거나 같은 것을 찾아서 
--시작월이 2월이면 날짜 그대로, 1월이면,2월01일로, 12월이어도 02월01로합니다. 
--종료월이 2월이면 날짜 그대로, 3월이면 2월28일, 4월이어도 2월28일로 합니다.

반응형

댓글