Выберите данные из диапазона дат между двумя датами
У меня есть таблица Named Product_Sales
и она содержит данные вроде этого
Product_ID | Sold_by | Qty | From_date | To_date
-----------+---------+-----+------------+-----------
3 | 12 | 7 | 2013-01-05 | 2013-01-07
6 | 22 | 14 | 2013-01-06 | 2013-01-10
8 | 11 | 9 | 2013-02-05 | 2013-02-11
Теперь, каков запрос, если я хочу выбрать данные о продажах между двумя датами из диапазона дат?
Например, я хочу выбрать данные продаж от 2013-01-03
до 2013-01-09
.
Ответы
Ответ 1
![interval intersection description]()
Как вы можете видеть, есть два способа добиться успеха:
- заручиться всеми приемлемыми параметрами
- исключить все неправильные параметры
Очевидно, что второй способ намного проще (только два случая против четырех).
Ваш SQL будет выглядеть так:
SELECT * FROM Product_sales
WHERE NOT (From_date > @RangeTill OR To_date < @RangeFrom)
Ответ 2
SELECT * from Product_sales where
(From_date BETWEEN '2013-01-03'AND '2013-01-09') OR
(To_date BETWEEN '2013-01-03' AND '2013-01-09') OR
(From_date <= '2013-01-03' AND To_date >= '2013-01-09')
Вы должны охватить все возможности. From_Date или To_Date могут находиться между диапазоном дат или датами записи могут охватывать весь диапазон.
Если один из From_date
или To_date
находится между датами, или From_date
меньше даты начала, а To_date
больше, чем дата окончания; то эта строка должна быть возвращена.
Ответ 3
Попробуйте выполнить запрос для получения дат между диапазоном:
SELECT *
FROM Product_sales
WHERE From_date >= '2013-01-03' AND
To_date <= '2013-01-09'
Ответ 4
SELECT * FROM Product_sales
WHERE From_date between '2013-01-03'
AND '2013-01-09'
Ответ 5
SELECT *
FROM Product_sales
WHERE (
From_date >= '2013-08-19'
AND To_date <= '2013-08-23'
)
OR (
To_date >= '2013-08-19'
AND From_date <= '2013-08-23'
)
Ответ 6
Попробуйте:
DECLARE @FrmDt DATETIME, @ToDt DATETIME
SELECT @FrmDt='2013-01-03', @ToDt='2013-01-09'
SELECT *
FROM Product_sales
WHERE (@FrmDt BETWEEN From_date AND To_date) OR
(@ToDt BETWEEN From_date AND To_date)
Ответ 7
select *
from table
where
( (table.EndDate > '2013-01-05') and (table.StartDate < '2013-01-07' ) )
Ответ 8
Только мои 2 цента, я считаю, что формат "dd-MMM-yyyy" наиболее безопасен, поскольку сервер db будет знать, чего вы хотите, независимо от региональных настроек на сервере. В противном случае вы могли бы столкнуться с проблемами на сервере с региональными настройками даты как yyyy-dd-mm (по какой бы то ни было причине)
Таким образом:
SELECT * FROM Product_sales
WHERE From_date >= '03-Jan-2013'
AND To_date <= '09-Jan-2013'
Это всегда сработало для меня: -)
Ответ 9
Эта работа над SQL_Server_2008 R2
Select *
from Product_sales
where From_date
between '2013-01-03' and '2013-01-09'
Ответ 10
Этот запрос поможет вам:
select *
from XXXX
where datepart(YYYY,create_date)>=2013
and DATEPART(YYYY,create_date)<=2014
Ответ 11
SELECT NULL
FROM HRMTable hm(NOLOCK)
WHERE hm.EmployeeID = 123
AND (
(
CAST(@Fromdate AS date) BETWEEN CAST(hm.FromDate AS date)
AND CAST(hm.ToDate AS date)
)
OR (
CAST(@Todate AS date) BETWEEN CAST(hm.FromDate AS date)
AND CAST(hm.ToDate AS date)
)
)
)
Ответ 12
Отметьте этот запрос, я создал этот запрос, чтобы проверить, проверяется ли дата проверки на коленях с датами бронирования
SELECT * FROM tbl_ReservedRooms
WHERE NOT ('@checkindate' NOT BETWEEN fromdate AND todate
AND '@checkoutdate' NOT BETWEEN fromdate AND todate)
это приведет к повторению деталей, которые накладываются друг на друга, чтобы получить не перекрывающиеся детали, а затем удалить "NOT" из запроса
Ответ 13
Вы также можете попробовать использовать следующие фрагменты:
select * from Product_sales
where From_date >= '2013-01-03' and game_date <= '2013-01-09'
Ответ 14
Это просто, используйте этот запрос, чтобы найти выбранные данные из диапазона дат между двумя датами
select * from tabblename WHERE (datecolumn BETWEEN '2018-04-01' AND '2018-04-5')
Ответ 15
Вы должны сравнивать даты в sql так же, как сравнивать числовые значения,
SELECT * FROM Product_sales
WHERE From_date >= '2013-01-01' AND To_date <= '2013-01-20'
Ответ 16
Вот запрос, чтобы найти все продажи продукта, которые были запущены в течение августа.
- Найти Product_sales были активны в течение августа.
- Включить все, что началось до конца августа
- Исключить все, что закончилось до 1 августа.
Также добавляет оператор case для проверки запроса
SELECT start_date,
end_date,
CASE
WHEN start_date <= '2015-08-31' THEN 'true'
ELSE 'false'
END AS started_before_end_of_month,
CASE
WHEN NOT end_date <= '2015-08-01' THEN 'true'
ELSE 'false'
END AS did_not_end_before_begining_of_month
FROM product_sales
WHERE start_date <= '2015-08-31'
AND end_date >= '2015-08-01'
ORDER BY start_date;
Ответ 17
Этот код будет работать хорошо:
Контроллер:
$this->load->model("YourModelName");
$data ['query'] = $this->YourModelName->get_report();
Модель:
public function get_report()
{
$query = $this->db->query("SELECT *
FROM reservation WHERE arvdate <= '2016-7-20' AND dptrdate >= '2016-10-25' ");
return $query;
}
где "arvdate" и "dptrdate" - две даты в базе данных, а "резервирование" - это имя таблицы.
Вид:
<?php
echo $query->num_rows();
?>
Этот код должен возвращать количество строк.
Чтобы вернуть данные таблицы, используйте
$query->rows();
return $row->table_column_name;
Ответ 18
DECLARE @monthfrom int=null,
@yearfrom int=null,
@monthto int=null,
@yearto int=null,
@firstdate DATE=null,
@lastdate DATE=null
SELECT @firstdate=DATEADD(month,@monthfrom-1,DATEADD(year,@yearfrom-1900,0)) /*Setting First Date using From Month & Year*/
SELECT @lastdate= DATEADD(day,-1,DATEADD(month,@monthto,DATEADD(year,@yearto-1900,0)))/*Setting Last Date using From Month & Year*/
SELECT * FROM tbl_Record
WHERE (DATEADD(yy, Year - 1900, DATEADD(m, Month - 1, 1 - 1)) BETWEEN CONVERT(DATETIME, @firstdate, 102) AND
CONVERT(DATETIME, @lastdate, 102))
Ответ 19
Это охватывает все условия, которые вы ищете.
SELECT * from Product_sales where (From_date <= '2013-01-09' AND To_date >= '2013-01-01')
Ответ 20
это легко, используйте этот запрос, чтобы найти то, что вы хотите.
select * from Product_Sales where From_date<='2018-04-11' and To_date>='2018-04-11'