如何使用同一个sql查询多个日期?

问题描述 投票:0回答:2

我有以下选择查询

(从表中选择计数(*)

出生日期 >= TO_DATE(:start_date1, 'YYYY/MM/DD')

和出生日期 <= TO_DATE(:end_date1, 'YYYY/MM/DD')) AS count1

我还需要找到“start_date2”和“end_date2”的计数,这将导致单独的变量“count2”

获得“count2”的最佳方式是什么?

我重写了查询,并将 startdate1 和 enddate1 替换为 startdate2 和 enddate2。有没有其他方法而不需要重写查询?

php sql oracle date variables
2个回答
0
投票

如果您想避免重写整个查询,可以通过使用 CTE(公用表表达式)来计算单个查询中两个日期范围的计数来实现此目的。这种方法并没有完全消除重写查询,而是封装了共享逻辑。这是使用 CTE 的示例:

WITH DateRanges AS (
  SELECT
    (SELECT COUNT(*)
     FROM TABLE
     WHERE birth_date >= TO_DATE(:start_date1, 'YYYY/MM/DD')
       AND birth_date <= TO_DATE(:end_date1, 'YYYY/MM/DD')) AS count1,
    (SELECT COUNT(*)
     FROM TABLE
     WHERE birth_date >= TO_DATE(:start_date2, 'YYYY/MM/DD')
       AND birth_date <= TO_DATE(:end_date2, 'YYYY/MM/DD')) AS count2
)
SELECT count1, count2
FROM DateRanges;

此 SQL 查询使用名为 DateRanges 的 CTE 通过对每个日期范围使用单独的 SELECT COUNT(*) 子查询来计算 count1 和 count2,而无需重复整个查询逻辑。这种方法允许您在单个查询执行中计算这两个计数。


0
投票

您可以连接返回每个日期的子查询,然后使用

GROUP BY

SELECT t1.start_date, t1.end_date, COUNT(t2.birth_date) AS count
FROM (
    SELECT :start_date1 AS start_date, :end_date1 AS end_date
    UNION ALL
    SELECT :start_date2, :end_date2
) AS t1
LEFT JOIN TABLE AS t2 ON t2.birth_date BETWEEN t1.start_date AND t1.end_date
GROUP BY t1.start_date, t1.end_date
© www.soinside.com 2019 - 2024. All rights reserved.