SQL-запрос для полуночных транзакций - PullRequest
0 голосов
/ 11 сентября 2018

Какой запрос я использую для получения транзакций, включая полночь (после полуночи). Например:

1 января 2018 года

Наши универмаги открыты ежедневно с 7:00 до 2:00 (на следующий день) Таким образом, в 2 часа ночи транзакции рассматриваются как продажа за «1 января 2018 года»

Это мой запрос

WHERE Date BETWEEN '2018-01-01' AND '2018-01-02'
and Time >= '1754-01-01 07:00:00.000' and Time <='1754-01-01 01:59:00.000' 

В настоящее время мой запрос принимает транзакции только до 11:59:59. Но наш магазин открывается за полночь, Я хочу получить транзакцию каждый день до 2 утра * 012 *

Ответы [ 4 ]

0 голосов
/ 11 сентября 2018

Поскольку ваш день смещен на 2 часа на следующий день, я просто перенесу вашу дату обратно на 2 часа.

Вот пример / тестовый код. Выборка вычитает 2 часа из ввода @testdate datetime, а затем усекает его до дня, отсекая часы

declare @testdate as datetime = '2018-01-01 10:15'
select cast(dateadd(hour,-2,@testdate) as date)

set @testdate = '2018-01-02 01:15'
select cast(dateadd(hour,-2,@testdate) as date)

Оба оператора выбора возвращают

2018-01-01

Если вы храните дату и время отдельно, дополнительно запустите следующий sql, чтобы объединить их

cast(Date as datetime) + cast(Time as datetime)

например,

select cast(dateadd(hour,-2,cast(Date as datetime) + cast(Time as datetime)) as date)
0 голосов
/ 11 сентября 2018

Если вы просто хотите получать транзакции за данный день, вы можете объявить дату в переменной, а затем выполнить запрос поиска записей, которые находятся между (@date + 7 часов: 7 утра) и (@date + 26часы: 2 часа ночи следующего дня), что можно сделать с помощью функции dateadd.Для простоты я также объявил начальную и конечную даты в переменных.

Declare @date datetime = '2018-01-01';
Declare @startdate datetime = dateadd(hour, 7, @date);
Declare @enddate datetime = dateadd(hour, 26, @date);

select * 
from table
WHERE Date BETWEEN @startdate AND @enddate

Это будет работать, только если ваш столбец даты имеет тип данных datetime.

Если выХраня свою дату и время в отдельных столбцах, вы можете объединить их.Вот так:

Declare @date datetime = '2018-01-01';
Declare @startdate datetime = dateadd(hour, 7, @date);
Declare @enddate datetime = dateadd(hour, 26, @date);

select * 
from table
WHERE (cast(date as datetime) + cast(cast(time as time) as datetime)) 
BETWEEN @startdate AND @enddate
0 голосов
/ 11 сентября 2018

В идеале вы должны объединить столбец «Дата и время» внутри одного столбца DATETIME.Сказав это, должно работать следующее:

WITH testdata(Date, Time) AS (
    SELECT '2018-01-01', '1754-01-01 06:00:00' UNION
    SELECT '2018-01-01', '1754-01-01 07:00:00' UNION
    SELECT '2018-01-01', '1754-01-01 08:00:00' UNION
    SELECT '2018-01-01', '1754-01-01 23:00:00' UNION
    SELECT '2018-01-02', '1754-01-01 00:00:00' UNION
    SELECT '2018-01-02', '1754-01-01 01:00:00' UNION
    SELECT '2018-01-02', '1754-01-01 06:00:00' UNION
    SELECT '2018-01-02', '1754-01-01 07:00:00' UNION
    SELECT '2018-01-02', '1754-01-01 08:00:00' UNION
    SELECT CAST(NULL AS DATE), CAST(NULL AS DATETIME) -- type cast
)
SELECT *
FROM testdata
WHERE Date BETWEEN '2018-01-01' AND '2018-01-02'
AND (
    Date = '2018-01-01' AND Time >= '1754-01-01 07:00:00' OR 
    Date = '2018-01-02' AND Time <  '1754-01-01 07:00:00'
)

Для полноты изложения я включаю любую транзакцию до 7:00 утра предыдущего дня.Результат:

| Date       | Time                    |
|------------|-------------------------|
| 2018-01-01 | 1754-01-01 07:00:00.000 |
| 2018-01-01 | 1754-01-01 08:00:00.000 |
| 2018-01-01 | 1754-01-01 23:00:00.000 |
| 2018-01-02 | 1754-01-01 00:00:00.000 |
| 2018-01-02 | 1754-01-01 01:00:00.000 |
| 2018-01-02 | 1754-01-01 06:00:00.000 |
0 голосов
/ 11 сентября 2018

если в столбце даты есть время, просто используйте

WHERE Date>='2018-01-01 07:00:00.000' AND Date<='2018-01-02 01:59:00.000'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...