SQL Server에서 날짜 문자열을 날짜/시간과 비교하시겠습니까?
-
08-06-2019 - |
문제
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'에 인덱스가 존재하는 경우 이를 사용한다는 것입니다.
다른 팁
연도, 월, 일 값을 비교해 보세요.
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();