일, 월, 년을 정수로 지정한 SQL Server에서 날짜를 생성하는 방법
예를 들어 다음과 같은 경우:
DECLARE @Day int = 25
DECLARE @Month int = 10
DECLARE @Year int = 2016
돌아가고 싶습니다
2016-10-25
날짜 또는 날짜 시간으로 지정
SQL Server 2012+에서 다음을 사용할 수 있습니다.datefromparts():
select datefromparts(@year, @month, @day)
이전 버전에서는 문자열을 캐스트할 수 있습니다.한 가지 방법이 있습니다.
select cast(cast(@year*10000 + @month*100 + @day as varchar(255)) as date)
SQL Server 2012+에서 ()를 사용할 수 있습니다.
DECLARE @Year int = 2016, @Month int = 10, @Day int = 25;
SELECT DATEFROMPARTS (@Year, @Month, @Day);
이전 버전에서는 문자열을 만들고 변환하는 방법이 있습니다.
날짜, 언어 또는 국제화 설정에 관계없이 SQL Server가 안정적으로 해석하는 몇 가지 문자열 날짜 형식이 있습니다.
6자리 또는 8자리 문자열은 항상 ymd로 해석됩니다.월과 일은 항상 두 자리여야 합니다.
https://learn.microsoft.com/en-us/sql/t-sql/data-types/datetime-transact-sql
따라서 'yyyymmdd' 형식의 문자열은 항상 올바르게 해석됩니다.
(ISO 8601--YYYY-MM-DDThh:mm:ss또한 작동하지만 시간을 지정해야 하므로 필요 이상으로 복잡합니다.)
당신이 간단하게 할 수 있는 동안.CAST이 문자열을 날짜로 사용해야 합니다.CONVERT스타일을 지정하려면 스타일을 지정해야 하며, 결정론적이 되려면 스타일을 지정해야 합니다(중요한 경우).
"yyyymmdd" 형식은 스타일 112이므로 변환은 다음과 같습니다.
DECLARE @Year int = 2016, @Month int = 10, @Day int = 25;
SELECT CONVERT(date,CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),112);
그 결과:
2016-10-25
기술적으로 ISO/112/yyyymmdd 형식은 지정된 다른 스타일에서도 작동합니다.예를 들어 스타일 104(독일어, dd.mm .yyyy)와 함께 텍스트 형식을 사용하는 경우:
DECLARE @Year int = 2016, @Month int = 10, @Day int = 25;
SELECT CONVERT(date,CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),104);
여전히 결과는 다음과 같습니다.
2016-10-25
다른 형식은 그다지 견고하지 않습니다.예를 들어 다음과 같습니다.
SELECT CASE WHEN CONVERT(date,'01-02-1900',110) = CONVERT(date,'01-02-1900',105) THEN 1 ELSE 0 END;
결과:
0
참고로, 이 방법을 사용할 경우, 넌센스 입력이 유효하지만 잘못된 날짜를 산출할 수 있다는 점에 유의하십시오.
DECLARE @Year int = 2016, @Month int = 0, @Day int = 1025;
SELECT CONVERT(date,CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),112);
산출물:
2016-10-25
DATEFROMPARTS는 잘못된 입력으로부터 사용자를 보호합니다.다음 항목:
DECLARE @Year int = 2016, @Month int = 10, @Day int = 32;
SELECT DATEFROMPARTS (@Year, @Month, @Day);
산출물:
Msg 289, 레벨 16, 상태 1, 라인 2 데이터 형식 날짜를 구성할 수 없습니다. 일부 인수에 유효하지 않은 값이 있습니다.
또한 1000-01-01 이전 날짜에는 이 방법이 작동하지 않습니다.예:
DECLARE @Year int = 900, @Month int = 1, @Day int = 1;
SELECT CONVERT(date,CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),112);
산출물:
문자열에서 날짜 및/또는 시간을 변환할 때 Msg241, 레벨 16, 상태 1, 라인 2 변환에 실패했습니다.
이는 결과 문자열 '9000101'이 'yyyymmdd' 형식이 아니기 때문입니다.적절한 포맷을 보장하기 위해서는 적은 양의 성능을 희생하면서 선행 0으로 패딩해야 합니다.예:
DECLARE @Year int = 900, @Month int = 1, @Day int = 1;
SELECT CONVERT(date,RIGHT('000' + CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),8),112);
결과:
0900-01-01
문자열 변환 외에도 다른 방법이 있습니다.몇 가지는 "T-SQL로 날짜 만들기"에 대한 답변에 제공됩니다.주목할 만한 예로는 "제로 날짜"에 연도, 월 및 일을 추가하여 날짜를 만드는 것을 들 수 있습니다.
(이 답변은 Gordon Linoff의 답변에서 영감을 얻었으며, 이 답변에 대해 자세히 설명하고 추가 문서와 참고 사항을 제공했습니다.)
이전 Microsoft SQL Server(< 2012)
RETURN dateadd(month, 12 * @year + @month - 22801, @day - 1)
다음 코드는 제가 생각하는 모든 버전의 sql server에서 작동해야 합니다.
SELECT CAST(CONCAT(CAST(@Year AS VARCHAR(4)), '-',CAST(@Month AS VARCHAR(2)), '-',CAST(@Day AS VARCHAR(2))) AS DATE)
SQL Server 2008 사용자를 위해 다음과 같은 사용자 지정 기능을 만들었습니다.
CREATE FUNCTION sql2012_datefromparts
(
@Year int, @Month int, @Day int
)
RETURNS DATETIME
AS
BEGIN
RETURN convert(datetime,convert(varchar,@year)+right('0'+convert(varchar,@month),2)+right('0'+convert(varchar,@day),2))
END
GO
사용 방법:
DECLARE @day int=29, @month int=10, @year int=1971
SELECT dbo.sql2012_datefromparts(@year,@month,@day)
간편하고 가장 유연한 솔루션
FORMAT 함수를 사용하여 원하는 형식을 만들 수 있습니다.다음은 복사 붙여넣기 작업 예제입니다.
DECLARE @year int = 2021, @month int = 12, @day int = 16
DECLARE @date varchar(20)
SET @date = cast((format(@year,'####') +'-'+format(@month,'##')+'-'+format(@day,'##')) as date)
SELECT @date
또한 며칠 및 몇 달 동안 선행 0을 표시합니다.
따라서 다음 솔루션을 사용해 볼 수 있습니다.
DECLARE @DAY INT = 25
DECLARE @MONTH INT = 10
DECLARE @YEAR INT = 2016
DECLARE @DATE AS DATETIME
SET @DATE = CAST(RTRIM(@YEAR * 10000 + @MONTH * 100 + @DAY) AS DATETIME)
SELECT REPLACE(CONVERT(VARCHAR(10), @DATE, 102), '.', '-') AS EXPECTDATE
또는 코드 몇 줄을 사용해 볼 수 있습니다.
DECLARE @DAY INT = 25
DECLARE @MONTH INT = 10
DECLARE @YEAR INT = 2016
SELECT CAST(RTRIM(@YEAR * 10000 +'-' + @MONTH * 100+ '-' + @DAY) AS DATE) AS EXPECTDATE
변환 선택(varchar(11), transfer_date, 106)
2018년 3월 7일로 포맷된 제가 원하는 날짜의 결과를 받았습니다.
'transfer_date' 열은 datetime 유형 열이며 zure에서 SQL Server 2017을 사용하고 있습니다.
SQL에서 월별 연도를 사용하여 날짜 만들기:
DECLARE @FromMonth int=NULL,
@ToMonth int=NULL,
@FromYear int=NULL,
@ToYear int=NULL
/**Region For Create Date**/
DECLARE @FromDate DATE=NULL
DECLARE @ToDate DATE=NULL
SET @FromDate=DateAdd(day,0, DateAdd(month, @FromMonth - 1,DateAdd(Year, @FromYear-1900, 0)))
SET @ToDate=DateAdd(day,-1, DateAdd(month, @ToMonth - 0,DateAdd(Year, @ToYear-1900, 0)))
/**Region For Create Date**/
언급URL : https://stackoverflow.com/questions/35576983/how-to-create-a-date-in-sql-server-given-the-day-month-and-year-as-integers
'programing' 카테고리의 다른 글
| Visual Studio 디버거에서 배열을 보시겠습니까? (0) | 2023.05.15 |
|---|---|
| ng가 내부 또는 외부 명령으로 인식되지 않습니다. (0) | 2023.05.10 |
| 문자열 배열에서 모든 빈 요소 제거 (0) | 2023.05.10 |
| 동일한 라인에 새 출력 인쇄 (0) | 2023.05.10 |
| 게시물:제약 조건이 없는 경우 제약 조건 추가 (0) | 2023.05.10 |