SQL Server에서 날짜 문자열을 날짜 시간과 비교하시겠습니까?
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의 DATTIME 항목이 아마도 SQLBOL에서 가장 많이 검색되는 주제이기 때문에 이 질문에 대한 나만의 답변을 게시하려고 합니다.
명확한 예제를 업데이트하여 보다 구체적으로 설명합니다.
편집 죄송합니다. 하지만 잘못된 답변(잘못된 결과를 반환하는 답변)을 다운모뎀해야 했습니다.
@조릿:WHERE (date>'20080813' AND date<'20080815')
13일과 14일에 돌아올 것입니다.
@우리는 짐보입니다:근접했지만 시가는 없습니다! 배지는 당신에게 수여됩니다.14/08/2008 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 필드가 색인화되어 있지 않고 색인화될 가능성이 낮거나 색인이 사용될 가능성이 낮으면 DATEIFF()를 사용하는 것이 더 짧습니다.
당신이 수락한 답변의 색인에 대한 좋은 지적입니다.
그럼에도 불구하고, 만약 당신이 정말로 특정에서만 검색한다면.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
저는 보통 날짜-시간을 날짜로 변환하고 다음과 같이 비교합니다.
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
이 함수 주형(바닥(주형(날짜())을 플로트로 가져오기) 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에서 DATTIME 필드의 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 *
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" 형식의 막대 문자로 변환됩니다.
이것은 매우 추하지만, 효과가 있을 것입니다.
날짜는 문자열 비교를 사용하여 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 참조
막대 열을 변환하고 선택한 날짜와 비교하는 중입니다.
구문:
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() 함수.sample: DateVariable을 사용하여 날짜 값의 짧은 문자열을 전달합니다.To ShortDateString();
언급URL : https://stackoverflow.com/questions/10825/compare-a-date-string-to-datetime-in-sql-server
'programing' 카테고리의 다른 글
수정된 라인만 표시하는 Gitdiff (0) | 2023.08.17 |
---|---|
Gradle 버전을 어떻게 결정합니까? (0) | 2023.08.17 |
#undef 앞에 #ifdef가 언제 필요합니까? (0) | 2023.08.17 |
HTML5 텍스트 영역 자리 표시자가 나타나지 않음 (0) | 2023.08.17 |
Android 웹 보기 느림 (0) | 2023.08.17 |