2009-12-30 2 views
1

У меня есть datecreated Поле в таблице. Он содержит значение, как «2009-12-30 11: 47: 20: 297» У меня есть запрос, как это:Чтобы получить дату с datetime в sql

select * 
    from table 
where DateCreated = getdate() 

Хотя одна строка существует с сегодняшнего дня, я не получаю эту строку при выполнении выше запрос. Может ли кто-нибудь помочь?

+1

Питер Ди Чекко является лучшим вариантом, это позволяет использовать индексы. –

+0

Можете ли вы пометить версию SQL Server, которую вы используете, поскольку SQL 2008 имеет тип DATE, который вы можете использовать. Спасибо –

ответ

3

Причина, по которой ваш запрос не возвращает ожидаемую строку, заключается в том, что GETDATE() возвращает дату и время в момент выполнения запроса. Значение в вашем столбце DateCreated не будет соответствовать временной части, поэтому строки не возвращаются.

Существуют различные способы построения запроса, чтобы он оценивал дату на основе только компонента даты. Вот один пример:

WHERE YEAR(datecreated) = YEAR(GETDATE()) 
    AND MONTH(datecreated) = MONTH(GETDATE()) 
    AND DAY(datecreated) = DAY(GETDATE()) 

К сожалению реальность такова, что любой запрос, используя функцию на колонке означает, что если существует индекс на столбце, он не может быть использован.

+0

, но вы можете сделать YEAR(), MONTH(), DAY() в постоянных вычисленных столбцах на вашей таблице, а затем проиндексировать их ..... –

+1

@marc_s: Это похоже на то, что придумал бы тот, кто злоупотребляет искусственными ключами. (Извините, я не удержался;)) ... Серьезно, хотя, посмотрите на ответ Питера Ди Чекко - это лучший, предоставляющий возможность использовать индексы. –

+0

@Craig: хорошо, зависит - если вам нужно, например, выберите месяц только раз в месяц (для ежемесячных отчетов и т. д.), это может быть действительный подход –

3

Вы можете использовать что-то подобное с Sql Server

CREATE FUNCTION [dbo].[udf_DateOnly](@DateTime DATETIME) 
RETURNS DATETIME 
AS 
BEGIN 
    RETURN DATEADD(dd,0, DATEDIFF(dd,0,@DateTime)) 
END 

Эта линия

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

будет вырезать Дата часть.

1

Вы можете преобразовать DateTime в строку только на дату, используя
CONVERT(varchar(8), GETDATE(), 112)

При необходимости, вы можете изменить его обратно в дату и в результате вы получите DateTime с часами, минуты , секунды и миллисекунды установлены на ноль.

+0

Хотя это работает, я бы не рекомендовал его. Для начала, обработка строк, сделанная внутренне, снижает производительность. Но что более важно, это приводит к тому, что разработчики сталкиваются с некоторыми плохими и потенциально опасными привычками. –

+0

Определенно приятно знать. Можете ли вы также рассказать мне, каковы потенциальные опасности, связанные с использованием этого подхода? – Carlos

2

Поле даты и времени включает в себя как дату, так и время, точную до миллисекунды. Ваш запрос будет работать только в том случае, если он является точной миллисекундой, хранящейся в базе данных.

Чтобы проверить это сегодня, но игнорировать время дня, вы можете проверить диапазон, как это:

select * from table where 
DateCreated >= '2009-12-30' and 
DateCreated < '2009-12-31' 

Вы можете использовать это в сочетании с функцией, которая преобразует текущую дату, а наблюдатель или Хилон. Вот полный пример, на котором можно ответить на вопрос. Кроме того, как указывает Крейг Янг, это будет работать с индексами.

select * from table where 
DateCreated >= DATEDIFF(dd,0,GETDATE()) and 
DateCreated < DATEDIFF(dd,0,GETDATE()) 
+1

+1: Чтобы подчеркнуть, диапазон должен быть включен с одной стороны и исключать друг друга. То есть > = и <точно так, как показано. BTW, быть педантичным, datetime только _accurate_ примерно до 17 миллисекунд. –

+1

PS: Я предпочитаю механизм наблюдателя для удаления времени из результата 'GETDATE()'. То есть 'where DateCreated> = DATEDIFF (dd, 0, GETDATE()) и DateCreated

2

Самое простое решение может быть: ответ

SELECT CAST(GETDATE() as DATE) 
+0

Да, если вы используете SQL Server 2008 или новее, так как тогда DATatype был наложен. –

Смежные вопросы