SQL не тянет записи, основанные на точной дате - PullRequest
1 голос
/ 23 сентября 2011

Я экспортировал записи, и я хочу знать, какая запись была экспортирована в определенный день. Это не работает. Вот данные, если я сделаю запрос.

* comapny Name *     * date exported *
ABC Company, Inc    2011-08-01 15:44:52.857
XYZ Company, Inc    2011-08-01 15:44:52.857

Я ввожу эту команду, которая не находит точные совпадения

select companyname, exporteddate from mytable exporteddate = '2011-08-01' <- does not work
select companyname, exporteddate from mytable exporteddate like '%2011-08-01%' <-- tried this variation too and many other, did not work

Интересно, что> =,>, <= работает. В чем действительно проблема? Экспортируемая дата объявляется как поле даты и времени. </p>

select companyname, exporteddate from mytable exporteddate >= '2011-08-01' <- this works

Я использую Windows XP, MS-SQL 2005 SP3 (не совсем, но близко).

Ответы [ 7 ]

4 голосов
/ 23 сентября 2011

= '2011-08-01' будет соответствовать datetimes ровно полуночи этой даты (т. Е. Любые строки, которые у вас есть, имеют значения 2011-08-01 00:00:00.00).

Лучший способ выполнить запрос - where exporteddate >= '20110801' and exporteddate < '20110802'

Это допустимо, позволяет избежать неоднозначных форматов datetime и лучше, чем альтернатива BETWEEN с конечным условием на 20110801 23:59:59.997, поскольку оно основывается на деталях реализации о максимальной точности типа данных datetime, который будет нарушен если вы перейдете на новый тип данных SQL Server 2008 datetime2 на более позднем этапе.

1 голос
/ 23 сентября 2011

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

Чтобы заставить это работать, вы можете:

  1. Поиск по диапазону значений DATETIME

    WHERE exporteddate BETWEEN '2011-08-01 00:00:00.000' AND '2011-08-01 23:59:59.999'

  2. Преобразование хранилища из DATETIME в DATE (простейшее решение, если вам действительно не нужно различать несколько загрузок в одну дату).

0 голосов
/ 23 сентября 2011

Попробуйте, вы конвертируете обе даты в один и тот же формат и сопоставляете их.

select companyname, exporteddate from mytable  CONVERT(VARCHAR,exporteddate ,103)= 

CONVERT(VARCHAR,'2011-08-01',103);
0 голосов
/ 23 сентября 2011

Как и многие другие предлагают, потому что вы не предоставляете время, вместо SQL будет использоваться 00:00:00.Чтобы сравнить DATE с DATEIME, вы можете преобразовать DATETIME в DATE.

Я не знаю, как добиться этого на SQL-сервере, но в MySQL это будет: выберите название компании, exporteddate из mytable DATE (exporteddate) = '2011-08-01'

0 голосов
/ 23 сентября 2011

Поля даты не работают как текстовые поля.

Ваш первый нерабочий выбор не включает время (которое содержится в данных).Вам нужно будет обрезать дату или преобразовать ее в строку, используя формат, который имеет только год / месяц / день.

То же самое для оператора LIKE.Это не текстовое поле.

Однако даты можно проверить на равенство, используя>, <и т. Д., Как вы видите. </p>

0 голосов
/ 23 сентября 2011

, если вы не укажете, часть времени будет точно 00:00:00, поэтому все эти секунды в вашей отметке времени будут препятствовать точному совпадению.

0 голосов
/ 23 сентября 2011

Поле даты и времени без указания времени интерпретируется как дата со временем 00: 00: 00.

...