【问题标题】:Get past 6 months data from a table based on the recent date present in the column根据列中的最近日期从表中获取过去 6 个月的数据
【发布时间】:2026-02-15 01:15:01
【问题描述】:

我有一个名为table 的数据库表,并且Col 中有一个列table,数据类型为varchar。列 Col 包含格式为 MMM-YY 的日期。 例如Col 的值为:

Col
DEC-21
NOV-21
SEP-20
OCT-19
DEC-21

我们可以看到数据可以像 DEC-21 一样被复制。我想根据Col 中最近一个月的数据提取最近 6 个月的数据。例如,如果 DEC-21 是最近的日期(考虑,日期不存在)等,我想要从 DEC-21 到 JUN-21 的数据,即如果我们将 DEC 映射到 12 和JUN 到 06。这个Table 有很多列,其中一列是我上面提到的Col,我必须使用 SQL 查询基于列Col 提取数据。

我写了一个查询:

SELECT *
FROM table
WHERE CAST(RIGHT(Col,4) AS INT) Between 2020 and 2021

但是在这里我得到了 2020 年到 2021 年之间的数据。所以,通过在上述查询中进行一些修改,或者是否有任何其他方法可以从 MMM-YYYY 格式从 @987654336 获取最近日期的过去 6 个月数据@专栏。
我在 R 中编写代码,我使用 dbGetQuery() 来传递 SQL 查询。在将其存储在数据框中后,我已经完成了此操作,但是有什么方法可以直接通过 sql 查询来完成吗?
任何帮助将不胜感激。

【问题讨论】:

  • 也许根据 col 中的条目添加一个具有真实日期时间类型的新列会有所帮助。您可以将日期设置为月初。
  • 是的,这可能会有所帮助,但我无法在表格中添加/删除列。有没有办法只使用“选择”来做到这一点?
  • 是的,我可以看到输出,但是当我通过在 dbGetQuery() 中将此 sql 查询作为字符串传递来在 RStudio 中运行它时,它显示错误为“'|'附近的语法不正确”。我正在使用 Microsoft SQL Server。 MSSQL 的语法是否不同?

标签: sql sql-server date select


【解决方案1】:

这样的事情应该可以工作。

SELECT * FROM table where CONVERT(DATE,'01-'+Col) BETWEEN '01-Jun-2021' and '31-Dec-2021'

【讨论】:

  • 谢谢,但它在某些特定日期之间。我想要列中最近日期的过去 6 个月的数据。我可以在使用“order by”按降序对列值进行排序后获取它并获取第一个值,从这个值中,我可以找到最近 6 个月的数据,但我无法使用“select”语句在单个 sql 查询中写入.
【解决方案2】:
with data as (
    select *,
        convert(date, '01-' + dt, 105) as converted_dt,
        max(convert(date, '01-' + dt, 105)) over () as last_converted_dt
    from T
)
select * from data
where converted_dt >= dateadd(month, -6, last_converted_dt);

105 来自日期格式列表,可在cast/convert 的文档中找到。 SQL Server 可以转换像 Apr 2021 这样的字符串,所以像下面这样的转换也可以工作(如果你实际上有四位数的年份),但最好像我上面所做的那样明确说明格式。

cast(replace(dt, '-', ' ' as date)

【讨论】:

  • 感谢您的回答。我在 RStudio 中运行代码,当我在 dbGetQuery() 函数中将上述 sql 查询作为字符串传递时,我得到的错误是“'105' 附近的语法不正确”。在用列名“Col”替换“dt”和用表名“table”替换“T”之后。我正在使用 MSSQL。可能是我做错了什么。你能告诉我错误吗,如果可能的话,你能告诉我数字“105”在这里的意义吗?
  • 上面更正了小语法错误。 sqlfiddle.com/#!18/df3c4/1
  • 谢谢!。现在,它没有显示任何错误,但它花费了太多时间。当我执行“从表中选择 *”时,它需要 2 分钟,但是当我运行上面的代码时,它已经花费了 10 分钟并且仍在运行。 “table”有约 460 万行。有什么办法可以优化上面的代码吗? @shawnt00
  • 这就是为什么将它存储为日期很重要的原因。如果不是,那么可能索引为计算列/过滤索引。可能要考虑创建视图。