Как я могу сравнить время в SQL Server? - PullRequest
57 голосов
/ 30 апреля 2009

Я пытаюсь сравнить время в поле datetime в запросе SQL, но я не знаю, правильно ли это. Я не хочу сравнивать часть даты, только часть времени.

Я делаю это:

SELECT timeEvent 
FROM tbEvents 
WHERE convert(datetime, startHour, 8) >= convert(datetime, @startHour, 8)

Это правильно?

Я спрашиваю это, потому что мне нужно знать, является ли 08:00:00 меньше или больше 07:30:00, и я не хочу сравнивать дату, только часть time .

Спасибо!

Ответы [ 16 ]

1 голос
/ 30 апреля 2009

Я не люблю полагаться на внутреннее хранилище данных (эта дата и время - это число с плавающей точкой с целым числом = день и дробным = время), но я делаю то же самое, что и ответ Джонни Д. Кано. Это способ, которым все известные мне разработчики db делают это. Определенно не конвертировать в строку. Если вам нужно избегать обработки как float / int, то лучший вариант - извлечь часы / минуты / секунды / миллисекунды с помощью DatePart ()

1 голос
/ 30 апреля 2009

Я считаю, что вы хотите использовать DATEPART('hour', datetime).

Ссылка здесь:

http://msdn.microsoft.com/en-us/library/ms174420.aspx

1 голос
/ 30 апреля 2009
SELECT timeEvent 
  FROM tbEvents 
 WHERE CONVERT(VARCHAR,startHour,108) >= '01:01:01'

Это говорит SQL Server преобразовать текущую дату / время в varchar, используя стиль 108, который является "чч: мм: сс". Вы также можете заменить '01: 01: 01 'на другое, если необходимо.

0 голосов
/ 02 февраля 2014

@ ronmurp вызывает действительную проблему - подход «бросок / пол» возвращает разные значения в одно и то же время. В дополнение к ответу @littlechris и для более общего решения, которое решает для моментов, которые имеют компонент в минуту, секунды и миллисекунды, вы можете использовать эту функцию для подсчета количества миллисекунд с начала дня.

Create Function [dbo].[MsFromStartOfDay] ( @DateTime datetime )
Returns int
As
  Begin
      Return (
               ( Datepart( ms , @DateTime ) ) +
               ( Datepart( ss , @DateTime ) * 1000 ) +
               ( Datepart( mi , @DateTime ) * 1000 * 60 ) +
               ( Datepart( hh , @DateTime ) * 1000 * 60 * 60 )
              )
  End

Я убедился, что он возвращает одно и то же int для двух разных дат с одинаковым временем

declare @first datetime
set @first = '1900-01-01 23:59:39.090'
declare @second datetime
set @second = '2000-11-02 23:56:39.090'
Select dbo.MsFromStartOfDay( @first )
Select dbo.MsFromStartOfDay( @second )

Это решение не всегда возвращает ожидаемое значение. Например, попробуйте ниже в SQL 2005, он возвращает int, заканчивающийся на «557» вместо «556».

set @first = '1900-01-01 23:59:39.556'
set @second = '2000-11-02 23:56:39.556'

Я думаю, что это связано с природой DateTime, хранящейся как float. Вы все еще можете сравнить два числа, хотя. И когда я использовал этот подход для «реального» набора данных DateTime, захваченного в .NET с помощью DateTime.Now () и сохраненного в SQL, я обнаружил, что вычисления были точными.

0 голосов
/ 16 мая 2011

ниже запроса дает вам время даты

select DateAdd(day,-DateDiff(day,0,YourDateTime),YourDateTime) As NewTime from Table
0 голосов
/ 30 апреля 2009

Я предполагаю, что столбец startHour и переменная @startHour имеют значение DATETIME; В этом случае вы должны конвертировать в строку:

SELECT timeEvent
FROM tbEvents
WHERE convert(VARCHAR(8), startHour, 8) >= convert(VARCHAR(8), @startHour, 8)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...