Ошибка SQL Server 2005 при получении записи на основе столбца первичного ключа Datetime - PullRequest
2 голосов
/ 26 августа 2010

У меня есть таблица в SQL Server 2005 с составным первичным ключом, то есть внешним ключом (INT) и столбцом DateTime.

Когда я запускаю SQL,

Select column1 From TABLE where ForeignKey=1 and DateTime='08/26/2010 11:24:36'

При наличии такой записи запись не возвращалась.

Один из вариантов -

Select column1 From TABLE where ForeignKey=1 and DateTime>='08/26/2010 11:24:36' and DateTime<'08/26/2010 11:24:37'

Но тогда это только кажется ... Я действительно должен прибегнуть к этому? или это потому, что я должен указать до миллисекунды? Или есть какие-то решения?

Пожалуйста, помогите. Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 26 августа 2010

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

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

/* CONVERT style 20 is yyyy-mm-dd hh:mi:ss */
Select column1 
    From TABLE 
    where ForeignKey=1 
        and CAST(CONVERT(char(19),DateTime,20) as datetime) = '08/26/2010 11:24:36'

РЕДАКТИРОВАТЬ : После замечаний ниже я заметил, что SQL Server не выглядитподобрать разницу в 1 миллисекунду в сравнении.Это верно в условиях 2000/2005/2008.Если в 2008 году я использую новый тип данных datetime2 , он будет работать, как и ожидалось.При чтении с типом данных datetime точность миллисекундной части округляется:

Точность: округляется с шагом 0,00, 0,003 или 0,007 секунд

declare @datetime1 datetime
declare @datetime2 datetime
declare @datetime3 datetime
declare @datetime4 datetime

set @datetime1 = '2010-08-30 08:41:51.513'
set @datetime2 = '2010-08-30 08:41:51.513'
set @datetime3 = '2010-08-30 08:41:51.514'
set @datetime4 = '2010-08-30 08:41:51.515'

/* Expected result 'Equal'; Actual result 'Equal' */
if @datetime1 = @datetime2
    print 'Equal'
else
    print 'Not Equal'

/* Expected result 'Not Equal'; Actual result 'Equal' */    
if @datetime1 = @datetime3
    print 'Equal'
else
    print 'Not Equal'

/* Expected result 'Not Equal'; Actual result 'Not Equal' */    
if @datetime1 = @datetime4
    print 'Equal'
else
    print 'Not Equal'
0 голосов
/ 30 августа 2010

Если это вообще возможно, не используйте поле даты и времени в качестве ключа. Вместо этого создайте другой ключ и просто индексируйте значение datetime.

...