Сравнить строку даты с datetime в 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

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


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


Редактировать Извините, но мне пришлось уменьшить НЕПРАВИЛЬНЫЕ ответы (ответы, которые возвращают неправильные результаты).

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
47
0
243 068
18
Перейти к ответу Данный вопрос помечен как решенный

Ответы 18

Ответ принят как подходящий

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

Я считаю, что CAST ('14 AUG 2008' как DateTime) немного лучше. Я думаю, что это немного более читабельно, и я считаю, что CAST более переносим, ​​чем CONVERT (), в том, что CAST () совместим с ANSI SQL-92 и -99.

Larry OBrien 25.09.2008 01:44

Вы можете использовать ключевое слово BETWEEN для сокращения этого ответа.

Möoz 16.08.2013 10:42

@BorhanMooz, на самом деле, BETWEEN не захватывает> = / technet.microsoft.com/en-us/library/ms187922.aspx, «Значение результата»).

Bondolin 16.08.2013 21:31

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

Это преобразует дату и время и строку в символы varchars формата «ГГГГ-ММ-ДД».

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

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

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

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)

Эта функция Cast (Floor (Cast (GetDate () As Float)) как 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

Разве несколько функций, применяемых к полю (если они проиндексированы), не преобразуют его в полное сканирование таблицы?

Manuel Ferreria 18.05.2009 17:19

Я знаю, что это не совсем то, как вы хотите, но это может быть началом:

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, column_datetime, 111) = '2008/08/14'

В SQL Server 2008 вы можете использовать новый тип данных DATE

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

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

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

А для мой:

Как получить часть DATE поля 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))

SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) + 
    '/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) + 
    '/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp

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

Хорошее замечание об указателе в принятом вами ответе.

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

а затем я предлагаю использовать один из форматов ISO для дат, которые распознаются большинством баз данных и не зависят от языка / локали, например YYYY-MM-DD

van 16.02.2010 12:02

В sqlserver

DECLARE @p_date DATE

SELECT * 
FROM table1
WHERE column_dateTime=@p_date

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

Дату можно сравнить на сервере sql, используя сравнение строк: например

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


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

SELECT * FROM tablename
WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012'

Обычно я конвертирую дату и время в дату и сравниваю их, например:

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

Лучший способ - просто извлечь часть даты с помощью функции SQL DATE ():

SELECT * 
FROM table1
WHERE DATE(column_datetime) = @p_date;

В 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

Другие вопросы по теме