SELECT GETDATE()
보고: 2008-09-22 15:24:13.790
시간 부분이없는 날짜 부분을 원합니다. 2008-09-22 00:00:00.000
어떻게 구할 수 있습니까?
SELECT GETDATE()
보고: 2008-09-22 15:24:13.790
시간 부분이없는 날짜 부분을 원합니다. 2008-09-22 00:00:00.000
어떻게 구할 수 있습니까?
답변:
에 SQL Server 2008
이상을 수행해야 CONVERT
날짜 :
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
장점 :
varchar
<-> datetime
전환 필요locale
마이클이 제안한대로
이 변형을 사용하십시오 : SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
select getdate()
SELECT DATEADD(hh, DATEDIFF(hh, 0, getdate()), 0)
SELECT DATEADD(hh, 0, DATEDIFF(hh, 0, getdate()))
SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, getdate()))
SELECT DATEADD(mm, DATEDIFF(mm, 0, getdate()), 0)
SELECT DATEADD(mm, 0, DATEDIFF(mm, 0, getdate()))
SELECT DATEADD(yy, DATEDIFF(yy, 0, getdate()), 0)
SELECT DATEADD(yy, 0, DATEDIFF(yy, 0, getdate()))
산출:
2019-04-19 08:09:35.557
2019-04-19 08:00:00.000
4763-02-17 00:00:00.000
2019-04-19 00:00:00.000
2019-04-19 00:00:00.000
2019-04-01 00:00:00.000
1903-12-03 00:00:00.000
2019-01-01 00:00:00.000
1900-04-30 00:00:00.000
datetime
데이터 유형이 수 없습니다 전혀 시간을 . 데이터 저장을 사용자 프레젠테이션과 혼동하고 있다고 생각합니다. 원하는 모든 것이 시간 부분이없는 문자열 (0이 아니라 공백)을 표시하는 방법이라면 간단하게 원 Convert(varchar(30), @Date, 101)
하거나 비슷합니다. 자세한 내용은 SQL Server 온라인 설명서 • 캐스트 및 변환 을 참조하십시오.
CAST(... AS DATE)
또는 CONVERT(DATE, ...)
이 페이지에서 꽤 자주 언급되었습니다.
SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)
후 때문에하는 것은 dd
다른 위해 밖으로 교환 할 수있는 datepart
당신을 절단하는 키워드 datetime
임의의 수준에서.
SQLServer 2008에는 이제 시간 구성 요소가없는 날짜 만 포함하는 '날짜'데이터 형식이 있습니다. SQLServer 2008 이상을 사용하는 사람은 다음을 수행 할 수 있습니다.
SELECT CONVERT(date, GETDATE())
SQL 2008 이상을 사용하는 경우 :
select cast(getdate() as date)
DateTime2
대신 사용 하면 정상적으로 작동합니다. sqlfiddle.com/#!6/9eecb7/2833
2015-10-01
으로 인해 DateTime
있습니다. 어떤 캐스트없이 시도 Date
, 그것은 산출 2015-10-01
너무! declare @date1 datetime = '2015-09-30 23:59:59.999';select @date1
=>2015-10-01
DATEADD 및 DATEDIFF가 varchar로 변환하는 것보다 낫습니다. 두 쿼리 모두 동일한 실행 계획이 있지만 실행 계획은 주로 데이터 액세스 전략 에 관한 것이며 모든 부분을 수행하는 데 소요되는 CPU 시간과 관련된 암시 적 비용을 항상 밝히지는 않습니다. 두 쿼리가 수백만 개의 행이있는 테이블에 대해 실행되는 경우 DateDiff를 사용하는 CPU 시간은 CPU 변환 시간의 1/3에 가깝습니다!
쿼리 실행 계획을 보려면
set showplan_text on
GO
DATEADD와 DATEDIFF는 모두 CONVERT_IMPLICIT를 실행합니다.
CONVERT 솔루션은 더 단순하고 읽기 쉽지만 속도 가 느립니다. datetime으로 캐스트 할 필요는 없습니다 (이것은 서버에 의해 내재적으로 수행됨). 정수 결과도 암시 적으로 datetime으로 다시 변환되므로 DateAdd의 DateDiff 메소드에는 실제로 필요하지 않습니다.
변환 선택 (varchar, MyDate, 101) FROM DatesTable
|--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101)))
|--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))
날짜 테이블에서 DATEADD (dd, 0, DATEDIFF (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)
위의 설명은 현재 형식을로 변환합니다 . 원하는 형식을 선택 YYYY/MM/DD
하려면 이 링크 를 참조하십시오 .
mm/dd/yyyy
형식입니다.
날짜 형식으로 반환
CAST (주문 날짜)
위 코드는 SQL Server 2010에서 작동합니다.
그것은 2013 년 12 월 12 일처럼 반환됩니다
SQL Server 2012의 경우 아래 코드를 사용하십시오.
CONVERT(VARCHAR(10), OrderDate , 111)
이 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
Format()
기능을 사용하십시오 .
SQL 서버에는 이미 여러 가지 답변과 형식이 있습니다. 그러나 대부분의 방법은 다소 모호하므로 특정 날짜 형식과 관련하여 형식 유형 또는 함수의 숫자를 기억하기가 어렵습니다. 그렇기 때문에 다음 버전의 SQL Server에는 더 나은 옵션이 있습니다.
FORMAT ( value, format [, culture ] )
문화권 옵션은 시청자별로 날짜를 지정할 수 있으므로 매우 유용합니다.
d (작은 패턴의 경우)와 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)
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日
더 많은 형식을 원하면 다음으로 이동할 수 있습니다.
CONVERT를 사용하고 원래 질문에서와 동일한 결과를 얻으려면, 즉 yyyy-mm-dd를 사용 CONVERT(varchar(10),[SourceDate as dateTime],121)
하여 이전 커플 답변과 동일한 코드 를 사용 하지만 대시로 yyyy-mm-dd로 변환하는 코드는 121.
soapbox를 잠깐 동안 사용할 수 있다면 이런 종류의 서식은 데이터 계층에 속하지 않기 때문에 실제 datepart 데이터 형식이 SQL Server 2008이 될 때까지 너무 많은 오버 헤드 '트릭'이 없으면 불가능한 것입니다. 소개했다. 데이터 계층에서 이러한 변환을 수행하는 것은 DBMS에 대한 오버 헤드를 크게 낭비하지만, 더 중요한 것은 이와 같은 작업을 수행 할 때 기본적으로 메모리에 고아가없는 데이터를 만든 다음 프로그램으로 돌아갈 것입니다. 다시 다른 3NF + 열에 다시 넣거나 되 돌리지 않고 입력 한 것과 비교할 수 없으므로 실패 지점이 발생하고 관계형 참조가 제거됩니다.
계속해서 dateTime 데이터 유형을 호출 프로그램 및 프리젠 테이션 티어에 리턴하고 필요한 조정을 수행하십시오. 호출자에게 반환하기 전에 변환하는 즉시 응용 프로그램에서 참조 무결성에 대한 모든 희망을 제거합니다. 이것은 일종의 수동 복귀를 수행하지 않으면 UPDATE 또는 DELETE 작업을 다시 방지 할 수 있습니다.
WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date);
-칼럼에서 시간을 제거 할 이유가 전혀 없습니다.
@Date
시간 부분이 없다고 가정하는 경우에만 작동합니다 . 사실이 아닌 경우에도 서버 측에서 시간을 자르는 방법을 알아야합니다. 이 대답에 동의하면 서식을 프레젠테이션 레이어에 남겨 두어야하지만 프런트 엔드를 그대로두면 빨리 자르는 빠른 방법을 알 필요가 없다는 의미에 동의하지 않습니다.
SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)
SELECT DATEADD(DAY, 0, DATEDIFF(DAY,0, GETDATE()))
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101))
편집 : 처음 두 방법은 본질적으로 동일하며 varchar 방법으로 변환을 수행합니다.
select dateadd(dd, datediff(dd, 0, getdate()), 0)
때문에, dd
S는 다음 중 어떤으로 교체 할 수 키워드 당신이 선택하는 어떤 세그먼트에서 날짜를 클립 할 수 있습니다. (또한 이 단어는의 약어 일뿐입니다 .)datepart
dd
day
좋아, 비록 조금 늦었지만 :) 다른 해결책이 있습니다.
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DATETIME)
결과
2008-09-22 00:00:00.000
그리고 SQL Server 2012 이상을 사용하는 경우 다음 FORMAT()
과 같은 기능 을 사용할 수 있습니다.
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')
고대 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
간단히 다음과 같이 할 수 있습니다.
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
왜 DATE_FORMAT (your_datetiem_column, '% d- % m- % Y')을 사용하지 않습니까?
전의: select DATE_FORMAT( some_datetime_column, '%d-%m-%Y' ) from table_name
'%d-%m-%Y'
부분 을 다시 정렬하여 m, d 및 year의 순서를 변경할 수 있습니다
나는 이것이 오래되었다는 것을 알고 있지만, 아무도이 방법으로 그것을 어디에 언급했는지 알 수 없습니다. 내가 알 수 있듯이 이것은 ANSI 표준입니다.
SELECT CAST(CURRENT_TIMESTAMP AS DATE)
Microsoft가 ANSI 표준 CURRENT_DATE 변수도 지원할 수 있다면 좋을 것입니다.
select {fn current_date()} as today
나를 위해 작동합니다.
날짜 부분과 날짜 형식에 다음을 사용할 수 있습니다.
DATENAME => 지정된 날짜의 지정된 날짜 부분을 나타내는 문자열을 반환합니다.
DATEADD =>이 DATEPART()
함수는 연도, 월, 일,시, 분 등과 같은 날짜 / 시간의 단일 부분을 반환하는 데 사용됩니다.
DATEPART => 지정된 날짜의 지정된 날짜 부분을 나타내는 정수를 반환합니다.
CONVERT()
=> CONVERT()
함수는 한 데이터 유형의 표현식을 다른 데이터 유형으로 변환하는 일반 함수입니다. 이
CONVERT()
기능을 사용하여 날짜 / 시간 데이터를 다른 형식으로 표시 할 수 있습니다.