Flower@12 Ответов: 4

Как получить конкретное значение из таблицы в SQL используя time in where condition


Мне нужно получить конкретное имя сдвига, используя только текущее системное время
Имя таблицы:tblShiftName
ID    ShiftName STime           ETime
1     S1        08:30:00        16:30:00
2     S2        16:31:00        00:30:00
3     S3        00:31:00        08:30:00

Например, мое входное время в 17:11 Теперь выходное-S2

Вышеизложенное-это мой ожидаемый результат, но я не получил этого ответа

Что я уже пробовал:

Ниже приведен запрос mty он не работает

Выберите ShiftName из tblShiftName, где STime in('17:15')

4 Ответов

Рейтинг:
8

MadMyche

То, что вы ищете, - это BETWEEN операция.
МЕЖДУ (Transact-SQL) - SQL Server | Microsoft Docs[^]

Что вы должны знать, так это то, что ваши данные, вероятно, должны быть скорректированы; разница в 1 минуту между окончанием смены и началом следующей смены вернет пустой набор записей

SELECT  ShiftName
FROM    tblShiftName
WHERE   '17:15' BETWEEN STime AND ETime


Рейтинг:
35

Maciej Los

Попробовать это:

SELECT ShiftName
FROM tblShiftName
WHERE @CurrentTime BETWEEN STIme AND ETime;


Заменять @CurrentTime с функцией базы данных, такой как: CONVERT (TIME, GETDATE())

Примечание: Я бы предложил хранить детали даты и времени (DATETIME тип данных).


OriginalGriff

Хм.
Вы заметили, что одна смена уходит за полночь?

Maciej Los

Да.
Кстати: вот почему я предлагаю использовать тип данных даты и времени вместо просто типа данных времени.

[no name]

Он работает спасибо вам сэр но я использовал
@CurrentTime1=приведение(конвертировать(тип varchar(20), getdate(), то 108) Как datetime) потому что я с помощью SQL Server 2005 с

Рейтинг:
22

OriginalGriff

То, что вам нужно, находится ближе к

SELECT ShiftName FROM tblShiftName WHERE '17:15' BETWEEN STime AND ETime
Но даже это не будет идеальным, или даже работать во всех случаях.

Проблема двоякая: во-первых, вы используете строки для хранения числовых значений, что означает, что все сравнения выполняются с использованием символьных проверок, поэтому результат всего сравнения зависит только от первой другой пары символов.

А во-вторых, ваши смены перекрывают полночь, поэтому ваше "время окончания" иногда раньше, чем ваше "время начала".

Лично я бы использовал числовое значение (возможно, "минуты с полуночи") и написал SP, который выполняет более сложную проверку, чем просто "Между", что примерно все, что вы можете сделать с текущей системой. Я бы посмотрел на текущее время и использовал его, чтобы решить, в какой день вы, скорее всего, будете, а затем проверить смену, а не "тупую" проверку.


[no name]

Просьба помочь этот запрос работает только в Ниже раз
С 08:30 до 16:30 и с 01:30 до 08:30
Но не работает с 16:30 до 00:30

Например
Мой ввод - '17:15', он не возвращает никаких строк, в чем проблема?

OriginalGriff

Цитата:
- А во-вторых, ваши смены перекрывают полночь, так что ваше "время окончания "иногда раньше, чем" время начала"."

Вот почему вам нужно быть намного более утонченным, чем "это между этим и этим".

[no name]

Если еще что то возможно пожалуйста помогите мне сэр

OriginalGriff

Подумайте о данных, которые у вас есть, и о том, как бы вы сделали это вручную.

Вам дается определенное время. Как вы сами решаете, в какой смене он находится? На данный момент игнорируйте компьютеры.

Рейтинг:
14

Richard Deeming

Исправить ночную смену довольно просто:

SELECT 
    ShiftName 
FROM 
    tblShiftName 
WHERE 
    -- Regular shift:
    (STime < ETime And @CurrentTime Between STime And ETime)
Or 
    -- Shift which spans midnight:
    (STime > ETime And (@CurrentTime >= STime Or @CurrentTime <= ETime))
;

Однако, если все времена не хранятся в UTC, у вас возникнут проблемы, когда часы изменятся на летнее время. Переход от 00:31 к 08:30 в конечном итоге будет работать дополнительный час, когда часы идут назад, и на час меньше, когда часы идут вперед. Вам нужно будет проверить бизнес-правила, чтобы решить, как с этим справиться.


Maciej Los

5ed!

[no name]

как установить одну и ту же дату между сегодняшним утренним временем 08:30 утра и утром следующего дня 08:30 утра