В 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 секунду до полуночи).
Техника 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-сервере 2008 Вы могли использовать новый тип данных ДАТЫ
DECLARE @pDate DATE='2008-08-14'
SELECT colA, colB
FROM table1
WHERE convert(date, colDateTime) = @pDate
@Guy. Я думаю, что Вы найдете, что это решение измеряет очень хорошо. Взгляните на [план выполнения вопроса] [1] из Вашего оригинального вопроса.
И для [моего] [2]:
[1]: http://cid-936d87e62ae20947.skydrive.live.com/self.aspx/vzczcPublic/Stackoverflow10825Query1. JPG [2]: http://cid-936d87e62ae20947.skydrive.live.com/self.aspx/vzczcPublic/Stackoverflow10825Query2. JPG [3]: http://cid-936d87e62ae20947.skydrive.live.com/self.aspx/vzczcPublic/Stackoverflow10825Query2. JPG
Просто сравните год, месяц и дневные ценности.
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)
Техника 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() будет короче.
Я обычно преобразовываю дату и время до настоящего времени и сравниваю их, как они:
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
Положительная сторона у индекса в ответе Вы приняли.
Однако, если Вы действительно ищете только в определенную 'ДАТУ' или 'ряды ДАТ' часто , тогда лучшее решение, которое я нашел, состоит в том, чтобы добавить другой, сохранился вычисленная колонка к Вашему столу, который будет только содержать 'ДАТУ' и добавлять индекс на этой колонке:
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
Как получить часть ДАТЫ области ДАТЫ И ВРЕМЕНИ в SQL-сервере MS:
Один из самых быстрых и самых опрятных способов сделать это использует
DATEADD(dd, DATEDIFF( dd, 0, @DAY ), 0)
Это избегает центрального процессора, обанкротившегося " преобразуйте дату в последовательность без времени и затем преобразования его назад again" логика.
Это также не выставляет внутреннее внедрение что " часть времени выражена как fraction" из даты.
Получите дату первого дня месяца
DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0)
Получите дату год rfom 1 назад
DATEADD(m,-12,DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0))
Эта функция Бросок (Пол (Бросок (GetDate () Как Плавание)) Как 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
Я знаю этот isn' t точно, как Вы хотите сделать это, но это могло быть начало:
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)
Это преобразует время данных и строку в varchars формата "YYYY-MM-DD".
Это очень некрасиво, но должно работать
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
Дата может быть сравнена в sqlserver, использующем сравнение последовательности: например.
DECLARE @strDate VARCHAR(15)
SET @strDate ='07-12-2010'
SELECT * FROM table
WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112)
Есть много форматов для даты в 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
SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) +
'/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) +
'/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp
SELECT * FROM tablename
WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012'
Лучший способ состоит в том, чтобы просто извлечь часть даты, используя ДАТУ SQL () Функция:
SELECT *
FROM table1
WHERE DATE(column_datetime) = @p_date;
В sqlserver
DECLARE @p_date DATE
SELECT *
FROM table1
WHERE column_dateTime=@p_date
В C# Передайте короткую последовательность использования стоимости даты ToShortDateString () функция. образец: DateVariable. ToShortDateString ();