SQL 语句中的条件 VS 后面代码中的条件

Conditions in SQL statement VS conditions later in code

考虑这个 myTable 有一些当天的记录:

+-----+---------------------+---------------------+
| id  | start_date          | end_date            |
+-----+---------------------+---------------------+
| 1   | 2017-07-17 12:00:00 | 2017-07-17 14:00:00 |
| 2   | 2017-07-17 8:00:00  | 2017-07-17 11:00:00 |
| 3   | 2017-07-17 13:00:00 | 2017-07-17 15:00:00 |
+-----+---------------------+---------------------+

假设我想 get records that overlap 12:00:00 -> 14:00:00(其中 12->14 是 目标)。

本质上,对 (RecordStart <= TargetEnd) and (RecordEnd >= TargetStart)

有效的记录

我可以使用以下其中一项来做到这一点:

1- sql 语句中的条件:

const myQuery = 
    "SELECT * FROM myTable " +
    "WHERE start_date <= '" + target_end_date +
    "' AND '" + target_start_date + "' <= end_date";

let filtered = DbConnection.query(myQuery)

2-代码中的条件:

const myQuery =  "SELECT * FROM myTable";

let records = DbConnection.query(myQuery)

let filtered = [];
records.map((rec) => {
    if(Date.parse(rec.start_date) <= Date.parse(target_end_date) && Date.parse(target_start_date) <= Date.parse(rec.end_date) ) 
        filtered.push_back(rec)
})

我应该遵循哪种做法?

更一般地说,选择最佳实践是面向案例的?这是否取决于数据库有多大 and/or 结果会有多大?或者有一些我还不知道的关于sql vs code的知识?

作为程序员,我是否为每个用例构建两种方法并进行测试然后选择?

编辑:

考虑到每个 processing-related/querying 事情都会发生在 API 端,然后 filtered(这两种方法的最终结果相同)将通过网络发送返回给客户。

利用 Sql 功能进行过滤将是: - 性能 - 减少网络带宽使用 - 可维护 - 快速实施 ETC 毕竟Database是用来存储数据和进行CRUD操作的

使用 sql 过滤记录有两个原因。一是减少流经网络的数据量。第二个是尽量减少应用程序所需的 RAM 量。如果您引入太多数据,您可能会遇到堆 space 问题。

这里有两点需要考虑:

  • 尽可能提取最小、最有效的结果集
  • 尽可能少地访问数据库

您几乎总是希望专注于提取尽可能小、最高效的结果集。 IE。在 SQL.

中进行过滤

唯一应该在代码而不是 SQL 查询中过滤的情况是,如果您已经 需要 将整个 table 拉入内存并且稍后将过滤以不同方式查看它。