SQL Server DateTime 데이터 유형에서 날짜만 반환하는 방법
SELECT GETDATE()
품::2008-09-22 15:24:13.790
그 날짜 을 시간 부분 싶다.2008-09-22 00:00:00.000
어떻게 구할 수 있죠?
참고: 이 답변은 원본이 반환됩니다.DATETIME
★★★★★★★★★★★★★★★★★」DATETIME2
. true는 true입니다.DATE
(SQL Server 2008 후를를를 ) 。BenR을 사용하다
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
예를들면
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
준다
2008-09-22 00:00:00.000
장점:
- varchar <-> datetime 변환 불필요
- 로케일을 생각할 필요가 없다
SQL Server 2008에는 날짜만 포함된 날짜 데이터 유형이 있으며 시간 구성요소는 없습니다.SQL Server 2008 이후를 사용하는 모든 사용자는 다음을 수행할 수 있습니다.
SELECT CONVERT(date, GETDATE())
SQL 2008 이후를 사용하는 경우:
select cast(getdate() as date)
DATEADD와 DATIFF는 varchar로 변환하는 것보다 낫다.두 쿼리 모두 실행 계획은 동일하지만 실행 계획은 주로 데이터 액세스 전략에 관한 것이며 모든 작업을 수행하는 데 소요되는 CPU 시간과 관련된 암묵적인 비용을 항상 나타내는 것은 아닙니다.두 쿼리가 모두 수백만 개의 행이 있는 테이블에 대해 실행되는 경우 DateDiff를 사용하는 CPU 시간은 CPU 변환 시간의 1/3에 가까울 수 있습니다.
쿼리에 대한 실행 계획을 보려면:
set showplan_text on
GO
DATE ADD와 DATIFF는 모두 CONVERT_를 실행합니다.암묵적
CONVERT 솔루션이 더 단순하고 읽기 쉽지만 더 느립니다.Date Time 에 캐스트 할 필요는 없습니다(이것은 서버에 의해서 암묵적으로 행해집니다).또한 DateDiff 메서드에서는 나중에 DateAdd가 실제로 필요하지 않습니다.이는 정수 결과도 암묵적으로 DateTime으로 변환되기 때문입니다.
SELECT CONVERT(varchar, MyDate, 101) FROM DatesTable
|--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101)))
|--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))
DatesTable에서 DateADD(d, 0, DATIFF(dd, 0, MyDate))를 선택합니다.
|--Compute Scalar(DEFINE:([Expr1004]=dateadd(day,(0),CONVERT_IMPLICIT(datetime,datediff(day,'1900-01-01 00:00:00.000',CONVERT_IMPLICIT(datetime,[TEST].[dbo].[DatesTable].[MyDate],0)),0))))
|--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))
@digi가 제안하는 바와 같이 FLOOR()을 사용하면 DateDiff에 가까운 퍼포먼스가 발생하지만 DateTime 데이터 유형을 플로트하여 원래 값을 반환하는 것은 권장되지 않습니다.
여러분, 기억하세요.아무도 믿지 마세요.성능 통계를 보고 직접 테스트해 보십시오!
결과를 테스트할 때는 주의하세요.클라이언트에 행을 여러 개 선택하면 계산 수행 시보다 네트워크를 통해 행을 보내는 데 시간이 더 오래 걸리기 때문에 성능 차이가 숨겨집니다.따라서 모든 행에 대한 작업이 서버에서 수행되지만 클라이언트에 행 집합이 전송되지 않았는지 확인하십시오.
캐시 최적화가 쿼리에 영향을 미치는 시기에 대해 혼동하는 사람도 있는 것 같습니다.두 개의 쿼리를 동일한 배치 또는 개별 배치로 실행해도 캐싱에는 영향을 주지 않습니다.따라서 캐시를 수동으로 만료하거나 쿼리를 여러 번 실행할 수 있습니다.쿼리 #2에 대한 최적화는 후속 쿼리에도 영향을 미치므로 필요에 따라 실행 #1을 폐기하십시오.
다음은 DateDiff가 varchar로 변환하는 것보다 훨씬 빠르다는 것을 증명하는 전체 테스트 스크립트와 성능 결과를 보여 줍니다.
이것을 시험해 보세요.
SELECT CONVERT(VARCHAR(10),GETDATE(),111)
은 현재 을 의의음음음음음음음음음음음음음음음음음 to to to to로 합니다.YYYY/MM/DD
원하는 형식을 선택하려면 이 링크를 참조하십시오.
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
날짜 형식으로 반환하는 경우
CAST(OrderDate AS 날짜)
위의 코드는 sql server 2010에서 사용할 수 있습니다.
2013년 12월 12일에 반환될 예정입니다.
SQL Server 2012의 경우 다음 코드를 사용합니다.
CONVERT(VARCHAR(10), OrderDate , 111)
다음 작업을 수행합니다.
SELECT CAST(date_variable AS date)
또는 Postgre를 사용하여SQL:
SELECT date_variable::date
이것은 타이프캐스팅이라고 불립니다!
.CONVERT
이치노이치노
변환 함수를 사용하기 위한 구문은 다음과 같습니다.
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
가 varchar
그러다,,그러세요.
SELECT CONVERT(DATE, GETDATE()) --2014-03-26
SELECT CONVERT(VARCHAR(10), GETDATE(), 111) --2014/03/26
이미 위에서 언급한 바와 같습니다.
날짜 및 시간 형식의 결과가 필요한 경우 아래 쿼리 중 하나를 사용하십시오.
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 111)) AS OnlyDate
2014-03-26 00:00:00.000
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 112)) AS OnlyDate
2014-03-26 00:00:00.000
DECLARE @OnlyDate DATETIME SET @OnlyDate = DATEDIFF(DD, 0, GETDATE()) SELECT @OnlyDate AS OnlyDate
2014-03-26 00:00:00.000
SQL Server 2012 이상 버전을 사용하는 경우
기능을 사용합니다.
SQL Server에 대한 응답 및 형식 유형이 이미 여러 개 있습니다.그러나 대부분의 방법은 다소 애매하고 특정 날짜 형식에 대한 형식 유형이나 함수의 숫자를 기억하는 것이 어려울 수 있습니다.따라서 SQL Server의 다음 버전에는 더 나은 옵션이 있습니다.
FORMAT ( value, format [, culture ] )
Culture 옵션은 뷰어에 따라 날짜를 지정할 수 있으므로 매우 유용합니다.
d(작은 패턴의 경우)와 D(긴 패턴의 경우)를 기억해야 합니다.
1"d" - 짧은 날짜 패턴.
2009-06-15T13:45:30 -> 6/15/2009 (en-US)
2009-06-15T13:45:30 -> 15/06/2009 (fr-FR)
2009-06-15T13:45:30 -> 2009/06/15 (ja-JP)
2"D" - 긴 날짜 패턴.
2009-06-15T13:45:30 -> Monday, June 15, 2009 (en-US)
2009-06-15T13:45:30 -> 15 июня 2009 г. (ru-RU)
2009-06-15T13:45:30 -> Montag, 15. Juni 2009 (de-DE)
쿼리에 더 많은 예가 있습니다.
DECLARE @d DATETIME = '10/01/2011';
SELECT FORMAT ( @d, 'd', 'en-US' ) AS 'US English Result'
,FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English Result'
,FORMAT ( @d, 'd', 'de-de' ) AS 'German Result'
,FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC) Result';
SELECT FORMAT ( @d, 'D', 'en-US' ) AS 'US English Result'
,FORMAT ( @d, 'D', 'en-gb' ) AS 'Great Britain English Result'
,FORMAT ( @d, 'D', 'de-de' ) AS 'German Result'
,FORMAT ( @d, 'D', 'zh-cn' ) AS 'Chinese (Simplified PRC) Result';
US English Result Great Britain English Result German Result Simplified Chinese (PRC) Result
---------------- ----------------------------- ------------- -------------------------------------
10/1/2011 01/10/2011 01.10.2011 2011/10/1
US English Result Great Britain English Result German Result Chinese (Simplified PRC) Result
---------------------------- ----------------------------- ----------------------------- ---------------------------------------
Saturday, October 01, 2011 01 October 2011 Samstag, 1. Oktober 2011 2011年10月1日
더 많은 형식을 원하는 경우 다음을 참조하십시오.
SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),103) --21/09/2011
SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),101) --09/21/2011
SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),111) --2011/09/21
SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),107) --Sep 21, 2011
FLOOR() 사용 - 시간 부분을 잘라냅니다.
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
표시된 결과를 얻기 위해 다음 명령을 사용합니다.
SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))
나는 그것이 유용하다고 생각한다.
CONVERT를 사용하여 원래 질문에서와 동일한 출력(yyy-mm-ddd)을 얻으려면 다음과 같이 하십시오.CONVERT(varchar(10),[SourceDate as dateTime],121)
앞의 커플과 같은 코드로 응답하지만 대시 포함 yyy-mm-dd로 변환하는 코드는 121입니다.
잠시 설명하자면, 이러한 포맷은 데이터 계층에 속하지 않기 때문에 실제 날짜 부분 데이터 유형이 도입되는 SQL Server 2008까지 오버헤드가 높은 '트릭'이 없었다면 불가능했을 것입니다.데이터 계층에서 이러한 변환을 수행하는 것은 DBMS에 막대한 오버헤드를 초래하지만, 더 중요한 것은 이러한 작업을 수행하는 순간 기본적으로 메모리 내에서 고립된 데이터가 생성되고 그 후 프로그램으로 돌아갑니다.되돌리지 않고 다른 3NF+ 열에 다시 넣거나 입력한 항목과 비교할 수 없습니다. 따라서 오류 발생 지점과 관계 참조 제거만 수행되었습니다.
항상 dateTime 데이터 유형을 호출 프로그램으로 되돌리고 프레젠테이션 계층에서 필요한 조정을 수행해야 합니다.발신자에게 반환하기 전에 변환하는 즉시 응용 프로그램에서 참조 무결성에 대한 모든 희망이 사라집니다.이렇게 하면 수동 복귀를 하지 않는 한 UPDATE 또는 DELETE 조작을 방지할 수 있습니다.수동으로 복귀하지 않으면 데이터가 다시 휴먼/코드/그렘린 에러에 노출됩니다.
SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)
SELECT DATEADD(DAY, 0, DATEDIFF(DAY,0, GETDATE()))
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101))
Edit: 첫 번째 두 가지 방법은 기본적으로 동일하며 out은 varchar로 변환하는 방법을 수행합니다.
결과를 열 또는 변수에 할당하는 경우 DATE 유형을 지정하면 변환이 암묵적으로 이루어집니다.
DECLARE @Date DATE = GETDATE()
SELECT @Date --> 2017-05-03
Convert(nvarchar(10), getdate(), 101) ---> 5/12/14
Convert(nvarchar(12), getdate(), 101) ---> 5/12/2014
날짜:
SELECT CONVERT(날짜, GETDATE())CAST(GETDATE)를 날짜로 선택합니다.
시간:
SELECT CONVERT(시간, GETDATE(), 114)시간으로 CAST(GETDATE)를 선택합니다.
구문:
SELECT CONVERT (data_type(length)),Date, DateFormatCode)
예:
Select CONVERT(varchar,GETDATE(),1) as [MM/DD/YY]
Select CONVERT(varchar,GETDATE(),2) as [YY.MM.DD]
날짜 관련 모든 날짜 형식 코드:
DateFormatCode Format
1 [MM/DD/YY]
2 [YY.MM.DD]
3 [DD/MM/YY]
4 [DD.MM.YY]
5 [DD-MM-YY]
6 [DD MMM YY]
7 [MMM DD,YY]
10 [MM-DD-YY]
11 [YY/MM/DD]
12 [YYMMDD]
23 [yyyy-mm-dd]
101 [MM/DD/YYYY]
102 [YYYY.MM.DD]
103 [DD/MM/YYYY]
104 [DD/MM/YYYY]
105 [DD/MM/YYYY]
106 [DD MMM YYYY]
107 [MMM DD,YYYY]
110 [MM-DD-YYYY]
111 [YYYY/MM/DD]
112 [YYYYMMDD]
간단하게 다음과 같이 할 수 있습니다.
SELECT CONVERT(date, getdate())
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
출력:
2008-09-22 00:00:00.000
또는 다음과 같이 합니다.
SELECT CONVERT (DATE, GETDATE()) 'Date Part Only'
결과:
Date Part Only
--------------
2013-07-14
이 경우 날짜만 다음 쿼리를 실행합니다.
CONVERT(VARCHAR(10), getdate(), 111)를 선택합니다.
당신 경우엔 이게 통할 것 같아요
CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'
SELECT CONVERT(DATE, @yourdate)
네, 조금 늦었지만:) 또 다른 해결책이 있습니다.
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DATETIME)
결과
2008-09-22 00:00:00.000
Server 2012를 사용할 수 .FORMAT()
합니다.
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')
SQL SERVER 2012부터는 다음을 수행할 수 있습니다.
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')
오래된 MSSQL Server 7.0을 사용하더라도 다음 코드(이 링크의 정보)를 통해 원하는 날짜 형식을 얻을 수 있었습니다.
PRINT '1) Date/time in format MON DD YYYY HH:MI AM (OR PM): ' + CONVERT(CHAR(19),GETDATE())
PRINT '2) Date/time in format MM-DD-YY: ' + CONVERT(CHAR(8),GETDATE(),10)
PRINT '3) Date/time in format MM-DD-YYYY: ' + CONVERT(CHAR(10),GETDATE(),110)
PRINT '4) Date/time in format DD MON YYYY: ' + CONVERT(CHAR(11),GETDATE(),106)
PRINT '5) Date/time in format DD MON YY: ' + CONVERT(CHAR(9),GETDATE(),6)
PRINT '6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): ' + CONVERT(CHAR(24),GETDATE(),113)
다음과 같은 출력이 생성되었습니다.
1) Date/time in format MON DD YYYY HH:MI AM (OR PM): Feb 27 2015 1:14PM
2) Date/time in format MM-DD-YY: 02-27-15
3) Date/time in format MM-DD-YYYY: 02-27-2015
4) Date/time in format DD MON YYYY: 27 Feb 2015
5) Date/time in format DD MON YY: 27 Feb 15
6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): 27 Feb 2015 13:14:46:630
DATE_FORMAT( your_datetiem_column, '%d-%m-%Y')를 사용하지 않으시겠습니까?
»:select DATE_FORMAT( some_datetime_column, '%d-%m-%Y' ) from table_name
d, d, ㄴ 것 같다를 붙여서 m, d, 수 있습니다.'%d-%m-%Y'
교환
이게 오래됐다는 건 알지만 누가 이런 식으로 말했는지 모르겠어요.제가 알기로는 이게 ANSI 규격이에요.
SELECT CAST(CURRENT_TIMESTAMP AS DATE)
Microsoft도 ANSI 표준 CURRENT_DATE 변수를 지원할 수 있으면 좋겠습니다.
저는 언급되지 않은 다음 사항을 선호합니다.
DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))
또한 로컬이나 이중 변환은 신경 쓰지 않습니다. 단, 각 '날짜 부분'은 아마 계산을 할 것입니다.따라서 날짜 지정 방법보다 조금 느릴 수 있지만, 나에게는 훨씬 더 명확합니다.특히 연월별로 그룹화하고 싶은 경우(날짜를 1로 설정).
언급URL : https://stackoverflow.com/questions/113045/how-to-return-only-the-date-from-a-sql-server-datetime-datatype
'programing' 카테고리의 다른 글
아이폰에서 둥근 모서리 UILABEL을 작성하려면 어떻게 해야 하나요? (0) | 2023.04.14 |
---|---|
Swift Date 객체를 작성하려면 어떻게 해야 합니까? (0) | 2023.04.14 |
Windows 명령줄에서 폴더 크기 가져오기 (0) | 2023.04.14 |
코드 내에 Python 모듈을 설치하는 방법은 무엇입니까? (0) | 2023.04.14 |
Objective-C에서 여러 파라미터를 전달하려면 어떻게 해야 합니까? (0) | 2023.04.14 |