Использование МЕЖДУ с датами SQL и Coldfusion - PullRequest
1 голос
/ 07 марта 2012

Я пытаюсь получить заказы между определенными датами, используя оператор BETWEEN в SQL.

Мои форматы даты представлены в формате дд / мм / гггг.

ord_fdate - дата от: В настоящее время 01/03/2012
ord_tdate - дата: в настоящее время 07.03.2012

Я думал, что это вернет все заказы с 01.03.2012 (включая 01.03.2012) по 07.03.2012 (включая 07.03.2012).

Однако, он не получает заказы с датами 03/03/2012

Мой запрос ниже; я также включил выходные данные отладки запроса;

<cfset ord_fdate = DateFormat(ord_fdate, "dd/mm/yyyy")>
<cfset ord_tdate = DateFormat(ord_tdate, "dd/mm/yyyy")>
<cfquery name="getOrders" datasource="#application.dsn#">
SELECT 
  dbo.tbl_orders.uid_orders,
  dbo.tbl_orders.dte_order_stamp

FROM
  dbo.tbl_orders
  WHERE dbo.tbl_orders.uid_order_webid=<cfqueryparam cfsqltype="cf_sql_integer" value="#session.webid#">
  AND bit_order_archive=<cfqueryparam cfsqltype="cf_sql_bit" value="no">
  AND txt_order_status=<cfqueryparam cfsqltype="cf_sql_varchar" value="Awaiting Dispatch">
  AND dte_order_stamp BETWEEN <cfqueryparam cfsqltype="cf_sql_date" value="#createODBCDate(ord_fdate)#"> AND <cfqueryparam cfsqltype="cf_sql_date" value="#createODBCDate(ord_tdate)#">
  ORDER BY dte_order_stamp DESC
</cfquery>

Debug;

WHERE (dbo.tbl_orders.uid_order_webid=?
  AND bit_order_archive=?
  AND txt_order_status=?
  AND dte_order_stamp BETWEEN ? AND ?)


  ORDER BY dte_order_stamp DESC
Query Parameter Value(s) -
Parameter #1(cf_sql_integer) = 1
Parameter #2(cf_sql_bit) = NO
Parameter #3(cf_sql_varchar) = Awaiting Dispatch
Parameter #4(cf_sql_date) = {ts '2012-03-01 00:00:00'}
Parameter #5(cf_sql_date) = {ts '2012-03-07 00:00:00'}

Не уверен, почему это не работает.

База данных SQL 2008

Есть идеи?

Ответы [ 3 ]

4 голосов
/ 07 марта 2012

Ваше поле даты содержит время?Если это так, в промежутке будут только значения> = первая дата и <= вторая дата в полночь.Любая дата, включающая время после полуночи, будет игнорироваться. </p>

Обычно я делаю что-то подобное при работе с датами:

Если я хочу все с 01.01.2012, я настраиваю началодата - 01.01.2012, а дата окончания - один день спустя (в полночь) ...

declare @StartDate datetime = '01/01/2012'
declare @EndDate datetime = '01/02/2012'

Затем выберите следующие значения:

select * from your_table where date >= @StartDate and date < @EndDate

При проверкепо отношению к дате окончания я хочу что-нибудь со значением меньше, чем дата окончания.Это будет включать такие значения, как 01.01.2012 12:30, 01.01.2012 23:20 и т. Д.

1 голос
/ 07 марта 2012

Это зависит от того, какую базу данных вы используете, и вы не указали, какой вы являетесь, но многие не рассматривают BETWEEN как включающую.

Я обычно просто использую >= и <= с двумя предложениями.Это может быть или не быть менее эффективным, но я точно знаю, что я проверяю.

1 голос
/ 07 марта 2012
AND (DATE(dte_order_stamp) >= <cfqueryparam cfsqltype="cf_sql_date" value="#createODBCDate(ord_fdate)#">),
AND (DATE(dte_order_stamp) <= <cfqueryparam cfsqltype="cf_sql_date" value="#createODBCDate(ord_tdate)#">)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...