programing

SQL Server에서 날짜 문자열을 날짜 시간과 비교하시겠습니까?

javajsp 2023. 8. 17. 20:45

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