복붙노트

[SQL] 검사 시간은 두 번 (시간 데이터 형식) 사이 인 경우

SQL

검사 시간은 두 번 (시간 데이터 형식) 사이 인 경우

나는 날짜로 "만든"열이있는 테이블이있다.

내가 만든 값에 대한 시간이 두 번 사이에 있는지 확인하는 쿼리에 노력하고있어.

(자정)와 나는 오후 11 오전 7시 사이의 시간과 항목에 대한 쿼리에 노력하고있어 첫 번째 행의 생성 날짜는 ': 00 : 00.000 2013년 7월 1일 00'입니다.

select *
from MyTable
where CAST(Created as time) between '23:00:00' and '06:59:59'

그러나 결과가 반환되지 않습니다.

내가 날짜 시간 내 시간을 변환해야합니까?

해결법

  1. ==============================

    1.난 당신이 오후 11 시이 후에 또는 오전 7시 전에하다고 확인하려면 의심 :

    난 당신이 오후 11 시이 후에 또는 오전 7시 전에하다고 확인하려면 의심 :

    select *
    from MyTable
    where CAST(Created as time) >= '23:00:00' 
       or CAST(Created as time) < '07:00:00'
    
  2. ==============================

    2.

    select *
    from MyTable
    where CAST(Created as time) not between '07:00' and '22:59:59 997'
    
  3. ==============================

    3.나는 매우 비슷한 문제를 가지고 내 솔루션을 공유 할

    나는 매우 비슷한 문제를 가지고 내 솔루션을 공유 할

    이 테이블 (모든 MySQL은 5.6)을 감안할 때 :

    create table DailySchedule
    (
      id         int auto_increment primary key,
      start_time time not null,
      stop_time  time not null
    );
    

    시작 시간과 종료 시간 사이에 주어진 시간 × (: mm SS hh는) 모든 행을 선택합니다. 다음날 포함.

    참고 : (NOW 교체)가 어떤 시간처럼 당신을 X

    SELECT id
    FROM DailySchedule
    WHERE
      (start_time < stop_time AND NOW() BETWEEN start_time AND stop_time)
      OR
      (stop_time < start_time AND NOW() < start_time AND NOW() < stop_time)
      OR
      (stop_time < start_time AND NOW() > start_time)
    

    결과

    주어진

      id: 1, start_time: 10:00:00, stop_time: 15:00:00
      id: 2, start_time: 22:00:00, stop_time: 12:00:00
    
  4. ==============================

    4.이것은 또한 (심지어 SQL-Server 2005에서) 작동합니다 :

    이것은 또한 (심지어 SQL-Server 2005에서) 작동합니다 :

    SELECT *
    FROM dbo.MyTable
    WHERE Created >= DATEADD(hh,23,DATEADD(day, DATEDIFF(day, 0, Created - 1), 0))
      AND Created <  DATEADD(hh,7,DATEADD(day, DATEDIFF(day, 0, Created), 0))
    

    데모

  5. ==============================

    5.

    WITH CTE as
    (
    SELECT CAST(ShiftStart AS DATETIME) AS ShiftStart, 
    CASE WHEN ShiftStart > ShiftEnd THEN CAST(ShiftEnd AS DATETIME) +1
    ELSE CAST(ShiftEnd AS DATETIME) END AS ShiftEnd
    FROM **TABLE_NAME**
    )
    SELECT * FROM CTE
    WHERE 
    CAST('11:00:00' AS DATETIME) BETWEEN ShiftStart AND ShiftEnd -- Start of Shift
    OR CAST('23:00:00' AS DATETIME) BETWEEN ShiftStart AND ShiftEnd -- End of Shift
    
  6. ==============================

    6.우리가 변화 정보를 저장하는 테이블을 생각해 보자

    우리가 변화 정보를 저장하는 테이블을 생각해 보자

    테이블을 생성하는 SQL 쿼리를 확인하고 입력 (시간)을 기준으로 일정을 찾아주십시오

    표 변수 선언

    declare @MyShiftTable table(MyShift int,StartTime time,EndTime time)
    

    테이블 변수에 값을 추가

    insert into @MyShiftTable select 1,'01:17:40.3530000','02:17:40.3530000'
    insert into @MyShiftTable select 2,'09:17:40.3530000','03:17:40.3530000'
    insert into @MyShiftTable select 3,'10:17:40.3530000','18:17:40.3530000'
    

    "신고"라는 추가 필드와 다른 테이블 변수 만들기

    declare @Temp table(MyShift int,StartTime time,EndTime time,Flag int)
    

    시작 시간과 종료 시간을 교환과 임시 테이블에 값을 추가

    MyShift, 케이스 (상영> 종료 시각)을 종료 시각 다른 상영 단, 케이스 (상영> 종료 시각)을 상영 다른 ENDTIME 단, 경우 선택 @Temp 삽입 (상영> 종료 시각)로부터 @MyShiftTable 후 1 0 다른 단부

    입력 변수를 작성하면 Shift 키를 찾을 수

    declare @time time=convert(time,'10:12:40.3530000')
    

    쿼리가 제공되는 시간에 해당하는 변화를 찾을 수

    @Temp의 경우 (@time 상영 시간과 종료 시각 사이 myShift을 선택 플래그 = 0) 또는 (@time 생략) 상영 시간 및 종료 시각과 플래그 = 1 사이

  7. ==============================

    7.하고 대신 OR해야

    하고 대신 OR해야

    select *
    from MyTable
    where CAST(Created as time) >= '23:00:00' 
       AND CAST(Created as time) < '07:00:00'
    
  8. from https://stackoverflow.com/questions/17407481/check-if-a-time-is-between-two-times-time-datatype by cc-by-sa and MIT license