【问题标题】:Extracting date in SQL在 SQL 中提取日期
【发布时间】:2021-10-20 20:14:32
【问题描述】:

我有一个格式为 20210701 (YYYYMMDD) 的列到期日期,我想使用 SQL 提取除特定月份的 5 号以外的所有日期(如下图中突出显示的)

我使用了以下代码:

SELECT Due_Date_Key
FROM Table
WHERE Due_Date_Key <>20210705

但是,上面代码中的错误是它只排除了 7 月,而不排除其他月份。 如何从整列中提取除第 5 天以外的日期。

我们将不胜感激。

请注意,DUE_DATE_KEY 列是数字。

【问题讨论】:

  • 你可以适当地使用 NOT IN 代替
  • @Abra 该列是数字
  • @MarEll 我认为这仍然会过滤我们输入的月份,对吗?例如 `SELECT Due_Date_Key FROM Table WHERE Due_Date_Key NOT IN 20210705` 如果我错了,请纠正我。
  • 谢谢@Abra。是否可以提取最后两位数字,然后过滤除 05 之外的数字,下面的代码可以工作吗? ``` SELECT *, RIGHT (due_date_key,2) AS Day FROM table WHERE day 05```

标签: sql postgresql date


【解决方案1】:

更 SQLish 的方法是将字符串转换为日期,然后检查 day 是否不是 5

SELECT * FROM Table 
WHERE DATE_PART('day', to_date(cast(DUE_DATE_KEY as varchar), 'YYYYMMDD')) != 5

【讨论】:

  • 嗨@SagarPanchal 我尝试了上面的代码,但是我收到以下错误——“没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型转换。”-- .不知道该怎么做,任何输入都会有所帮助!
  • 我尝试了下面的代码,``` select *, RIGHT(due_date_key,2) AS Day FROM T WHERE Day > 5```我收到一个错误“没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。”不知道从这里怎么走
  • @Sid 您使用的是哪个 Postgres 版本? RIGHT 功能在 v9.3 之后可用。另外,为什么你做 day > 5,这在语法上是错误的,因为你没有“Day”作为列,即使你有,你也会错过 5 日之前的所有日子,你可以使用以下 SQL 来获取这一天作为单独的列 ``` SELECT Table.*, DATE_PART('day', to_date(DUE_DATE_KEY, 'YYYYMMDD')) FROM Table WHERE DATE_PART('day', to_date(DUE_DATE_KEY, 'YYYYMMDD')) != 5 `` `
  • 感谢您的投入,是的,我想带上 5 号以外的日期。我试过上面的代码。我收到一个错误,我创建了一个虚拟表并运行了建议的查询。请找到引发错误的链接。 link
  • @Sid 您看到错误是因为 DUE_DATE_KEY 是 int(8)。它需要转换为字符串。检查这个更新的link
【解决方案2】:

使用modulo运算符判断DUE_DATE_KEY的最后两位是否为05。

select * from T where DUE_DATE_KEY % 100 <> 5

使用您的示例数据,上述查询返回以下内容:

due_date_key
20210701
20210708
20210903

参考这个db fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多