Как сделать запрос к базе данных, где поля даты и времени разделены? - PullRequest
1 голос
/ 08 июня 2010

В полях «Таблица», «Время» и «Дата» есть два отдельных поля.Мне нужно сделать запрос что-то вроде этого дать все записи, где дата и время <= данноеDateTime.Как мне это сделать, пожалуйста? </p>

РЕДАКТИРОВАТЬ Мой запрос: -

select DateField, TimeField from Table1 where DateField <= '07/26/2009' and TimeField <= '16:26:20'

Результат: -

2008-04-22 00: 00: 00.000 1899-12-30 23: 59: 58.000

2009-04-15 00: 00: 00.000 1899-12-30 23: 59: 56.000

2006-06-06 00: 00: 00.000 1899-12-30 23: 59: 53.000

Смотрите приведенное выше время в результатах.Это неправильно

Ответы [ 3 ]

1 голос
/ 08 июня 2010

С вашей моделью данных:

select  DateField, 
        TimeField 
from    Table1 
where   (DateField < '07/26/2009')
    or  (DateField = '07/26/2009' and TimeField <= '16:26:20')

Но в идеале у вас может быть столбец computed, который будет содержать полную дату и время DateTimeField, и просто запросите соответствующий ему. Если этот запрос вы делаете часто, то вы можете сохранить этот вычисляемый столбец и даже создать индексы для этого столбца. Создание этого вычисляемого столбца в SQL Server 2008 тривиально, если вы используете типы данных DATE и TIME (как показано в ответе Кейда):

DateTimeField AS CONVERT(DATETIME, DateField + TimeField) PERSISTED NOT NULL

В случае SQL Server 2005 вам может потребоваться выполнить какое-то преобразование.

0 голосов
/ 08 июня 2010

Вы можете наивно добавлять значения даты и времени.

http://cloudexchange.cloudapp.net/stackoverflow/q/2558

Обратите внимание, что это не может быть SARG'able.

Я предполагаю, что один столбец - ДАТА SQL Server 2008, а другой - ВРЕМЯ.

-- Datetime Combination Example 
SELECT CAST(dt AS datetime) + CAST(tm AS datetime) AS dtm
FROM (
    SELECT CAST('6/7/2010' AS DATE) AS dt, CAST('12:34:00' AS TIME) AS tm
) AS X

Если они уже оба - datetime:

SELECT dt + tm AS dtm
FROM (
    SELECT CAST('6/7/2010' AS DATETIME) AS dt, CAST('12:34:00' AS DATETIME) AS tm
) AS X
0 голосов
/ 08 июня 2010

Разбейте @givenDateTime до компонента даты и компонента времени и используйте AND для построения предложения WHERE:

DECLARE @givenDate DATETIME 
SELECT @givenDate = DATEADD(dd, 0, DATEDIFF(dd, 0, @givenDateTime))

DECLARE @givenTime DATETIME 
SELECT @givenTime =  CONVERT(varchar(2),
      CASE
           WHEN DATEPART([hour], @givenDateTime) > 12 THEN CONVERT(varchar(2), (DATEPART([hour], @givenDateTime) - 12))
           WHEN DATEPART([hour], @givenDateTime) = 0 THEN '12'
           ELSE CONVERT(varchar(2), DATEPART([hour], @givenDateTime))
      END
 ) + ':' +
 CONVERT(char(2), SUBSTRING(CONVERT(char(5), @givenDateTime, 108), 4, 2)) + ' ' +
 CONVERT(varchar(2),
      CASE
           WHEN DATEPART([hour], @givenDateTime) > 12 THEN 'PM'
           ELSE 'AM'
      END
 ) 

SELECT * FROM myTable
WHERE tableDate <= @givenDate AND tableTime <= @givenTime

Дата конвертации взята из здесь . Преобразование времени взято с здесь .

Обратите внимание, что у @givenTime будет дата 01 Jan 1900 (плюс время), поэтому убедитесь, что в предложении where это учитывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...