Как я могу найти данные между двумя конкретными временами в SQL

Мне нужно выполнить запрос, который находит все даты входа в систему (dd/mm/yyyy) и время (hh.mm), которые произошли между 2 часами ночи вчера и 2 часами ночи сегодня. Время входа в базу данных имеет формат mm-dd-yyyy hh.mm.ss.

Я пробовал несколько запросов select и between, которые либо возвращали данные не в тот день, либо за пределами временных интервалов.


person Withdalot    schedule 16.08.2011    source источник
comment
Какова структура ваших данных, какие запросы вы пробовали, каков был результат и каков был ожидаемый результат?   -  person    schedule 16.08.2011
comment
В каком типе данных хранятся ваши даты и время? Хранятся ли они в виде строковых данных или собственного формата даты/времени?   -  person Philip Kelley    schedule 16.08.2011
comment
Я пробовал выбрать логин из логинов сотрудников, где логин между datepart(hh, getdate()-1) › 2 и datepart(hh, getdate()) › 2... Я новичок в этом, и теперь я полностью запутался.   -  person Withdalot    schedule 16.08.2011
comment
КАКАЯ база данных и какая версия?? SQL — это всего лишь язык структурированных запросов — язык, используемый многими системами баз данных — SQL НЕ является продуктом базы данных .... и такие функции очень часто зависят от поставщика...   -  person marc_s    schedule 16.08.2011


Ответы (5)


Основываясь на предоставленной вами информации, я могу привести только общий пример:

SELECT    *
FROM      [YourTable]
WHERE     [YourDate] BETWEEN '08-15-2011 02:00:00' AND '08-16-2011 02:00:00'

**ИЗМЕНИТЬ**

По хорошему предложению из комментариев, вот многоразовая версия:

SELECT    *
FROM      [YourTable]
WHERE     [YourDate] BETWEEN DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0) + '02:00'
                     AND DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()-1), 0) + '02:00'
person James Hill    schedule 16.08.2011
comment
Что делать, если мне нужно получить время между другими датами и временем? - person Vinay; 16.08.2011
comment
Извините, это не мой вопрос, и я не минусовал. Я почти не голосую против любого вопроса. Но моя точка зрения — это вчера, а сегодня могут быть разные даты. Что, если мне придется выполнить этот запрос завтра? - person Vinay; 16.08.2011
comment
@ Винай, извини, я поторопился и приношу свои извинения. Ты делаешь доброе дело. Я обновил свой ответ. - person James Hill; 16.08.2011
comment
Это то, что мне нужно, однако конкретные даты не будут существовать, поскольку запрос должен выполняться ежедневно в поисках записи между 2 часами ночи «вчера» и 2 часами ночи «сегодня»... - person Withdalot; 16.08.2011
comment
@Withdalot, SQL в разделе EDIT удовлетворит это требование. - person James Hill; 16.08.2011
comment
@Vinay - это моя точная проблема. Спасибо за помощь в разъяснении. - person Withdalot; 16.08.2011
comment
@James, извини, Джеймс, я до сих пор понятия не имею, как это будет работать. - person Withdalot; 16.08.2011
comment
@Withdalot, ты пробовал? DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0) + '02:00' вернет текущую дату в 2 часа ночи. DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()-1), 0) + '02:00' вернет вчерашнюю дату в 2 часа ночи. Пожалуйста, попробуйте. - person James Hill; 16.08.2011
comment
Джеймс, это здорово, и это работает. Большое спасибо за вашу помощь ... Ура - person Withdalot; 16.08.2011
comment
Пожалуйста. Не забудьте принять ответ: meta.stackexchange.com/questions/5234/. @Vinay, еще раз спасибо за разъяснение необходимости. - person James Hill; 16.08.2011

Предполагая MySQL:

SELECT * FROM your_table 
WHERE STR_TO_DATE(your_date, '%m-%d-%Y %H.%i.%s') BETWEEN
DATE_SUB(STR_TO_DATE(DATE_FORMAT(NOW(), '%m-%d-%Y'), '%m-%d-%Y'), INTERVAL 22 HOUR) AND
DATE_ADD(STR_TO_DATE(DATE_FORMAT(NOW(), '%m-%d-%Y'), '%m-%d-%Y'), INTERVAL 2 HOUR)

Хотя я уверен, что есть лучший способ.

person WhatAWorld    schedule 16.08.2011

Запрос не возвращает никаких записей, если мы используем следующее...

SELECT    *
FROM      [YourTable]
WHERE     [YourDate] BETWEEN DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0) + '02:00'
                 AND DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()-1), 0) + '02:00'

Мы используем предложение between, поэтому самая старая дата должна быть первой, и запрос становится следующим...

SELECT    *
FROM      [YourTable]
WHERE     [YourDate] BETWEEN DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()-1), 0) + '02:00'
                 AND DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0) + '02:00'
person venkat    schedule 01.07.2013

Это также может помочь вам

where pt.status in (1) 
    and pt.is_visible in ('t') 
    and pt.merchant in (0) 
    and (date(pt.created_at+'05:30') >= current_date-2 
            and extract(hour from(pt.created_at+'05:30')) >=17)
    and ((pt.created_at+'05:30') <= current_date-1
            and extract(hour from(pt.created_at+'05:30')) <=17)
person Piyush Ssharma    schedule 08.11.2017

Я думаю, что вы можете использовать эти советы:

SET @start = CURDATE() - interval 1 DAY + interval 2 HOUR;
SET @end = CURDATE() + interval 2 HOUR;

А также :

SELECT * FROM TABLE_NAME WHERE DATE_FIELD BETWEEN @start AND @end
person kadvsperera    schedule 02.05.2019