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일로 합니다.
'VB.NET&MSSQL' 카테고리의 다른 글
VB.NET EXCEL PageSetup 속성 (0) | 2020.05.21 |
---|---|
[MSSQL] 날짜 타입 변경 (0) | 2020.04.27 |
[MSSQL] SQL SERVER BACKUP SCHEDULE 설정 (0) | 2020.04.26 |
[vb.net] 이미지 파일 형식 (0) | 2020.04.25 |
[MSSQL] 세로 행을 가로 열로 문자열 합치기 (0) | 2020.04.22 |
댓글