Как запросить поле DATETIME, используя только дату в SQL Server?
Простой вопрос, но я пока не могу его решить...
У меня есть таблица TEST с полем DATETIME, например:
ID NAME DATE
1 TESTING 2014-03-19 20:05:20.000
Что мне нужно, так это запрос ниже возвращает эту строку и каждую строку с датой = 03/19/2014, независимо от времени:
select * from test where date = '03/19/2014';
Но он не возвращает строк. Только способ работы указывает также время:
select * from test where date = '03/19/2014 20:03:02.000';
Спасибо заранее!
Ответы
Ответ 1
диапазон использования или функция DateDiff
select * from test
where date between '03/19/2014' and '03/19/2014 23:59:59'
или
select * from test
where datediff(day, date, '03/19/2014') = 0
Другие варианты:
-
Если у вас есть контроль над схемой базы данных, и вам не нужно
время, вытащите его.
-
или, если вы должны сохранить его, добавьте вычисленный атрибут столбца, у которого отключена временная часть значения даты...
Alter table Test
Add DateOnly As
DateAdd(day, datediff(day, 0, date), 0)
или, в более поздних версиях SQL Server...
Alter table Test
Add DateOnly As
Cast(DateAdd(day, datediff(day, 0, date), 0) as Date)
тогда вы можете написать свой запрос просто:
select * from test
where DateOnly = '03/19/2014'
Ответ 2
Простой ответ;
select * from test where cast ([date] as date) = '03/19/2014';
Ответ 3
Я использую MySQL 5.6, и есть функция DATE для извлечения только даты с даты. Поэтому простое решение вопроса -
select * from test where DATE(date) = '2014-03-19';
http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html
Ответ 4
Попробуйте это
select * from test where Convert(varchar, date,111)= '03/19/2014'
Ответ 5
вы можете попробовать это
select * from test where DATEADD(dd, 0, DATEDIFF(dd, 0, date)) = '03/19/2014';
Ответ 6
select * from test
where date between '03/19/2014' and '03/19/2014 23:59:59'
Это реальный плохой ответ. По двум причинам.
1.
Что происходит со временем, например, 23.59.59.700 и т.д.
Времена больше 23:59:59 и на следующий день.
2.
Поведение зависит от типа данных.
Запрос ведет себя по-разному для типов datetime/date/datetime2.
Тестирование с 23: 59: 59.999 делает его еще хуже, потому что в зависимости от типа данных вы получаете разные округления.
select convert (varchar(40),convert(date , '2014-03-19 23:59:59.999'))
select convert (varchar(40),convert(datetime , '2014-03-19 23:59:59.999'))
select convert (varchar(40),convert(datetime2 , '2014-03-19 23:59:59.999'))
- Для даты значение "нарезанное".
- Для даты и времени значение округляется до следующей даты. (Ближайшее значение).
- Для datetime2 значение является точным.
Ответ 7
Вы можете использовать этот подход, который усекает временную часть:
select * from test
where convert(datetime,'03/19/2014',102) = DATEADD(dd, DATEDIFF(dd, 0, date), 0)
Ответ 8
Существует проблема с датами и языками, а способ избежать этого - запрашивать даты с этим форматом YYYYMMDD.
Этот путь ниже должен быть самым быстрым в соответствии со ссылкой ниже. Я проверил в SQL Server 2012, и я согласен со ссылкой.
select * from test where date >= '20141903' AND date < DATEADD(DAY, 1, '20141903');
http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx
С уважением.
Ответ 9
Проверьте этот запрос.
SELECT *,DATE(chat_reg_date) AS is_date,TIME(chat_reg_time) AS is_time FROM chat WHERE chat_inbox_key='$chat_key'
ORDER BY is_date DESC, is_time DESC
Ответ 10
Просто используйте это в своем предложении WHERE
.
Часть "SubmitDate" ниже - это имя столбца, поэтому вставьте свой собственный.
Это вернет только часть результатов "Года", опуская минуты и т.д.
Where datepart(year, SubmitDate) = '2017'
Ответ 11
select * from invoice where TRANS_DATE_D>= to_date ('20170831115959','YYYYMMDDHH24MISS')
and TRANS_DATE_D<= to_date ('20171031115959','YYYYMMDDHH24MISS');
Ответ 12
-- Reverse the date format
-- this false:
select * from test where date = '28/10/2015'
-- this true:
select * from test where date = '2015/10/28'