문제

SQL Server에는 DATETIME 시간 요소가 포함된 열입니다.

예:

'14 AUG 2008 14:23:019'

이것은 최상의 시간 부분을 무시하고 특정 날짜의 레코드만 선택하는 방법은 무엇입니까?

예:(시간 부분과 일치하지 않고 행을 반환하지 않으므로 안전하지 않습니다)

DECLARE  @p_date DATETIME
SET      @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )

SELECT *
FROM   table1
WHERE  column_datetime = @p_date

메모:이 사이트는 여러분이 집어 들었다가 잊어버린 메모와 기술을 기록하는 것이기도 하므로 MSSQL의 DATETIME 항목이 아마도 제가 SQLBOL에서 가장 많이 찾는 주제일 것이기 때문에 이 질문에 대한 답변을 게시할 것입니다.


업데이트 더 구체적으로 예시를 명확히 했습니다.


편집하다 죄송합니다. 하지만 WRONG 답변(잘못된 결과를 반환하는 답변)을 다운모드해야 했습니다.

@조릿: WHERE (date>'20080813' AND date<'20080815') 13일과 14일을 반환합니다.

@wearejimbo: 닫혀 있지만 시가는 없습니다! 당신에게 수여된 배지.2008년 8월 14일 23:59:001부터 23:59:999까지 작성된 기록을 놓쳤습니다(예:자정까지 1초도 채 남지 않았습니다.)

도움이 되었습니까?

해결책

기술 1:

 DECLARE @p_date DATETIME
 SET     @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )

 SELECT  *
 FROM    table1
 WHERE   column_datetime >= @p_date
 AND     column_datetime < DATEADD(d, 1, @p_date)

이것의 장점은 'column_datetime'에 인덱스가 존재하는 경우 이를 사용한다는 것입니다.

다른 팁

SQL Server 2008에서는 새로운 DATE 데이터 유형을 사용할 수 있습니다.

DECLARE @pDate DATE='2008-08-14'  

SELECT colA, colB
FROM table1
WHERE convert(date, colDateTime) = @pDate  

@남자.내 생각에 이 솔루션은 확장성이 매우 높다는 것을 알게 될 것입니다.다음을 살펴보세요. 쿼리 실행 계획 원래 쿼리의

그리고 내 거:

연도, 월, 일 값을 비교해 보세요.

Declare @DateToSearch DateTime
Set @DateToSearch = '14 AUG 2008'

SELECT * 
FROM table1
WHERE Year(column_datetime) = Year(@DateToSearch)
      AND Month(column_datetime) = Month(@DateToSearch)
      AND Day(column_datetime) = Day(@DateToSearch)

이 같은?

SELECT  *
FROM    table1
WHERE   convert(varchar, column_datetime, 111) = '2008/08/14'

기술 2:

DECLARE @p_date DATETIME
SET     @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )

SELECT  *
FROM    table1
WHERE   DATEDIFF( d, column_datetime, @p_date ) = 0

column_datetime 필드가 색인화되지 않았고 색인화될 가능성이 없는 경우(또는 색인이 사용될 가능성이 없는 경우) DATEDIFF()를 사용하는 것이 더 짧습니다.

귀하가 수락한 답변의 색인에 대한 좋은 지적입니다.

그래도 정말 특정 항목만 검색한다면 DATE 또는 DATE ranges 자주, 내가 찾은 가장 좋은 해결책은 테이블에 다음 항목만 포함하는 또 다른 지속형 계산 열을 추가하는 것입니다. DATE, 을 클릭하고 이 열에 인덱스를 추가합니다.

ALTER TABLE "table1" 
    ADD "column_date" AS CONVERT(DATE, "column_datetime") PERSISTED

해당 열에 인덱스를 추가합니다.

CREATE NONCLUSTERED INDEX "table1_column_date_nu_nci"
ON  "table1" ( "column_date" ASC )
GO

그러면 검색 속도가 더욱 빨라질 것입니다.

DECLARE  @p_date DATE
SET      @p_date = CONVERT( DATE, '14 AUG 2008', 106 )

SELECT   *
FROM     table1
WHERE    column_date = @p_date

이 기능 Cast(Floor(Cast(GetDate() As Float)) As DateTime) 시간 부분이 제거된 날짜/시간 데이터 유형을 반환하므로 그렇게 사용할 수 있습니다.

Select
*
Table1
Where
Cast(Floor(Cast(Column_DateTime As Float)) As DateTime) = '14-AUG-2008'

또는

DECLARE  @p_date DATETIME
SET      @p_date = Cast('14 AUG 2008' as DateTime)

SELECT   *
FROM     table1
WHERE    Cast(Floor(Cast(column_datetime As Float)) As DateTime) = @p_date

MS SQL Server에서 DATETIME 필드의 DATE 부분을 가져오는 방법:

이를 수행하는 가장 빠르고 깔끔한 방법 중 하나는 다음을 사용하는 것입니다.

DATEADD(dd, DATEDIFF( dd, 0, @DAY ), 0)

이는 CPU 버스팅 "날짜를 시간 없이 문자열로 변환한 다음 다시 다시 변환"하는 논리를 방지합니다.

또한 "시간 부분이 날짜의 일부로 표시되는" 내부 구현을 노출하지 않습니다.

해당 월의 첫 번째 날의 날짜를 가져옵니다.

DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0)

1년 전 날짜를 확인하세요.

DATEADD(m,-12,DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0))

나는 일반적으로 날짜-시간을 날짜로 변환하고 다음과 같이 비교합니다.

SELECT 'Same Date' WHERE CAST(getDate() as date) = cast('2/24/2012 2:23 PM' as date)

또는

SELECT 'Same Date' WHERE DATEDIFF(dd, cast(getDate() as date), cast('2/24/2012 2:23 PM' as date)) = 0

나는 이것이 정확히 당신이 원하는 방식이 아니라는 것을 알고 있지만 시작일 수 있습니다.

SELECT *
FROM (SELECT *, DATEPART(yy, column_dateTime) as Year, 
      DATEPART(mm, column_dateTime) as Month, 
      DATEPART(dd, column_dateTime) as Day 
      FROM table1)
WHERE Year = '2008'
AND Month = '8'
AND Day = '14'
SELECT  *
FROM    table1
WHERE   CONVERT(varchar(10),columnDatetime,121) = 
        CONVERT(varchar(10),CONVERT('14 AUG 2008' ,smalldatetime),121)

그러면 데이터 시간과 문자열이 "YYYY-MM-DD" 형식의 varchar로 변환됩니다.

이것은 매우 추악하지만 작동해야합니다

문자열 비교를 사용하여 sqlserver에서 날짜를 비교할 수 있습니다.예를 들어

DECLARE @strDate VARCHAR(15)
SET @strDate ='07-12-2010'


SELECT * FROM table
WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112)
DECLARE @Dat

SELECT * 
FROM Jai
WHERE                                                                                                          
CONVERT(VARCHAR(2),DATEPART("dd",Date)) +'/'+                                                              
             CONVERT(VARCHAR(2),DATEPART("mm",Date)) +'/'+              
                     CONVERT(VARCHAR(4), DATEPART("yy",Date)) = @Dat

가장 좋은 방법은 SQL DATE() 함수를 사용하여 날짜 부분을 추출하는 것입니다.

SELECT * 
FROM table1
WHERE DATE(column_datetime) = @p_date;
SELECT * FROM tablename
WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012'
SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) + 
    '/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) + 
    '/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp

SQL에는 날짜에 대한 다양한 형식이 지정되어 있습니다.나타내다 https://msdn.microsoft.com/en-in/library/ms187928.aspx

varchar 열을 선택한 날짜로 변환하고 비교합니다.

통사론:

SELECT * FROM tablename where CONVERT(datetime,columnname,103) 
    between '2016-03-01' and '2016-03-03'
In CONVERT(DATETIME,COLUMNNAME,103) "103" SPECIFIES THE DATE FORMAT as dd/mm/yyyy

SQL서버에서

DECLARE @p_date DATE

SELECT * 
FROM table1
WHERE column_dateTime=@p_date

C#에서 toshortDatestring () 함수를 사용하여 짧은 날짜 값을 전달하십시오.견본:DateVariable.ToShortDateString();

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top