Сравнить строку даты с datetime в SQL Server?

В SQL Server у меня есть DATETIMEстолбец, который включает элемент time.

Образец:

'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

Примечание: учитывая, что этот сайт также о записывании заметок и методов, которые вы выбираете, а затем забываете, я собираюсь опубликовать свой собственный ответ на этот вопрос, поскольку материал DATETIME в MSSQL, вероятно, является темой, которую я ищу больше всего в SQLBOL.


Обновить уточненный пример, чтобы быть более конкретным.


Edit Sorry, But i’ve had to down-mod неправильные ответы (ответы, которые возвращают неправильные результаты).

@Jorrit: WHERE (date>'20080813' AND date<'20080815')верну 13 — е и 14-е.

@wearejimbo: близко, но без сигары! значок вручается вам. Вы пропустили записи, написанные в 14.08.2008 23:59:001 до 23:59: 999 (т. е. менее чем за 1 секунду до полуночи.

18 ответов

  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’, если он существует.

  2. SELECT  *
    FROM    table1
    WHERE   CONVERT(varchar(10),columnDatetime,121) = 
            CONVERT(varchar(10),CONVERT('14 AUG 2008' ,smalldatetime),121)
    

    Это преобразует datatime и строку в varchars формата «YYYY-MM-DD».

    Это очень некрасиво, но должно сработать

  3. Техника 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() короче.

  4. Просто сравните значения года, месяца и дня.

    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)
    
  5. Эта функция Cast(Floor(Cast (GetDate () As Float)) As DateTime) возвращает тип данных 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
    
  6. Я знаю, что это не совсем так, как вы хотите сделать это, но это может быть началом:

    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'
    
  7. В SQL Server 2008 можно использовать новый тип данных DATE

    DECLARE @pDate DATE='2008-08-14'  
    
    SELECT colA, colB
    FROM table1
    WHERE convert(date, colDateTime) = @pDate  
    

    @Парень. Я думаю, вы обнаружите, что это решение отлично масштабируется. Ознакомьтесь с планом выполнения исходного запроса.

    И для моего:

  8. Как получить часть даты поля DATETIME в MS SQL Server:

    Один из самых быстрых и аккуратных способов сделать это-использовать

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

    Это позволяет избежать сбоя процессора «преобразовать дату в строку без времени, а затем преобразовать ее обратно» логики.

    Это также не раскрывает внутреннюю реализацию ,что «часть времени выражена как часть» даты.

    Получить дату первого дня месяца

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

    Получить дату rfom 1 год назад

    DATEADD(m,-12,DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0))
    
  9. SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) + 
        '/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) + 
        '/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp
    
  10. Хорошее замечание об индексе в принятом вами ответе.

    Тем не менее, если вы действительно ищете только по конкретному 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
    
  11. В sqlserver

    DECLARE @p_date DATE
    
    SELECT * 
    FROM table1
    WHERE column_dateTime=@p_date
    

    В C#
    Передайте короткую строку значения даты с помощью функции ToShortDateString ().
    образец:
    DateVariable.ToShortDateString();

  12. Date можно сравнить в sqlserver с помощью сравнения строк:
    например.

    DECLARE @strDate VARCHAR(15)
    SET @strDate ='07-12-2010'
    
    
    SELECT * FROM table
    WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112)
    
  13. SELECT * FROM tablename
    WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012'
    
  14. Я обычно конвертирую дату-время в дату и сравниваю их, как эти:

    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
    
  15. Лучший способ-просто извлечь часть date с помощью функции SQL DATE() :

    SELECT * 
    FROM table1
    WHERE DATE(column_datetime) = @p_date;
    
  16. Существует много форматов даты в 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