Выбор записей на основе текущего времени между ProgramStart и ProgramEnd - PullRequest
1 голос
/ 03 ноября 2010

Мне нужно выбрать все записи из моей базы данных SQL Server, которые находятся в промежутке между определенным часом. Позвольте привести пример:

Текущее время - 9:33, и в базе данных имеется множество записей Программы, в которых есть ProgramStart и ProgramEnd. Примером дат может быть:

 | ProgramStart             | ProgramEnd              | ClientID |
 +--------------------------+-------------------------+----------+
 | 1900-01-01 09:00:00.000  | 1900-01-01 10:00:00.000 | 5        |
 +--------------------------+-------------------------+----------+
 | 1900-01-01 11:00:00.000  | 1900-01-01 13:00:00.000 | 4        |
 +--------------------------+-------------------------+----------+
 | 1900-01-01 12:00:00.000  | 1900-01-01 14:00:00.000 | 5        |
 +--------------------------+-------------------------+----------+
 | 1900-01-01 11:00:00.000  | 1900-01-01 13:00:00.000 | 6        |
 +--------------------------+-------------------------+----------+
 | 1900-01-01 16:00:00.000  | 1900-01-01 17:00:00.000 | 7        |
 +--------------------------+-------------------------+----------+
 | 1900-01-01 16:00:00.000  | 1900-01-01 17:00:00.000 | 5        |
 +--------------------------+-------------------------+----------+
 | 1900-01-01 17:00:00.000  | 1900-01-01 18:00:00.000 | 4        |
 +--------------------------+-------------------------+----------+

Я хочу извлечь все записи для клиента 5 и между текущим временем, которое 9:33 утра

.

Как это сделать с помощью SQL. Я пробовал это, но это не работает:

 SELECT CAST('1900-01-01 09:33:00.000' AS datetime) AS TimeNow, * FROM Programs
 WHERE ClientID = 5
 AND TimeNow BETWEEN '1900-01-01 09:00:00.000' AND '1900-01-01 10:00:00.000'

любые предложения будут с благодарностью.

Большое спасибо, Пол

Ответы [ 3 ]

2 голосов
/ 03 ноября 2010

Это, но удалит компонент даты из GETDATE:

DATEADD(day, -DATEDIFF(DAY, 0, GETDATE()), GETDATE())

Включение этого в запрос

SELECT
     *
FROM
     Programs
WHERE
     ClientID = 5
     AND
     DATEADD(day, -DATEDIFF(DAY, 0, GETDATE()), GETDATE())
                 BETWEEN ProgramStart AND ProgramEnd

В SQL Server 2008+ у вас также есть тип данных времени.Тем не менее, тройной CAST один сделает недействительными индексы в ProgramStart и ProgramEnd, так что стоило бы поиграть с чем-то вроде второго

CAST(GETDATE() AS time) BETWEEN CAST(ProgramStart AS time) AND CAST(ProgramEnd AS time)
CAST(CAST(GETDATE() AS time) AS smalldatetime) BETWEEN ProgramStart AND ProgramEnd
2 голосов
/ 03 ноября 2010
select *
    from Programs
    where ClientId = 5
        and DATEADD(Day, 0-DATEDIFF(Day, 0, GetDate()), GetDate()) between ProgramStart and ProgramEnd
1 голос
/ 03 ноября 2010

Попробуйте:

SELECT *
FROM Programs
WHERE ClientId = 5
AND GETDATE() BETWEEN ProgramStart AND ProgramEnd

Обновление Я не заметил отсутствия компонента данных в данных. Вы должны посмотреть на ответ gbn, чтобы очистить дату после вызова GetDate (). Я не буду просто копировать его код здесь, потому что это кажется неправильным. :)

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