【问题标题】:Filter out records in specified day of week in PostgreSQL在 PostgreSQL 中过滤掉指定星期几的记录
【发布时间】:2019-11-27 02:37:20
【问题描述】:

我有根据条件之间的日期返回指定日期的内部查询。我成功获得了结果,但在外部查询中我想检查日期是否在我提供的字符串中-'Friday,Saturday'

SELECT * from 
    (
    SELECT id, to_char(markupdate, 'Day') as dayofweek 
    FROM test t 
    WHERE t.markupdate BETWEEN 'Thu Jul 11 00:00:00 IST 2019' AND 'Sat Jul 20 00:00:00 IST 2019'
    ) data
    WHERE data.dayofweek in ('Friday,Sunday');

【问题讨论】:

  • 更改为:WHERE data.dayofweek in ('Friday', 'Sunday')
  • 试过了!注意得到显示。
  • 尝试使用 ~ 的正则表达式。见此链接:postgresql.org/docs/11/functions-matching.html
  • 它可以工作,但我不能包含像 ('Friday','Saturday') 这样的数组。一天有效!
  • 我在想这样的事情:data.dayofweek~'.*Friday.*' or data.dayofweek~'.*Sunday.*'

标签: sql database postgresql date inner-query


【解决方案1】:

您可以使用正则表达式将您的 data.dayofweek 匹配到您正在寻找的字符串(FridaySunday)。你甚至不需要你的子查询,类似的东西也应该工作:

 SELECT id, to_char(markupdate, 'Day') as dayofweek 
 FROM test t 
 WHERE t.markupdate BETWEEN '2019-07-11 00:00:00+0530' AND '2019-07-20 00:00:00+0530'
 AND dayofweek~'(Friday|Sunday)';

更多背景信息请查看Postgres docs

【讨论】:

  • 我只看到三个问题。不必要的子查询、错误的正则表达式、基于假定数据库区域设置的字符串转换。否则,它在技术上适用于某些场景。
  • @coladict:现在这样更好吗?
  • 正则表达式更好,ISO8601日期是标准的,所以你甚至不需要to_date
【解决方案2】:
SELECT id, to_char(markupdate, 'Day') as dayofweek 
FROM test t 
WHERE t.markupdate BETWEEN 'Thu Jul 11 00:00:00 IST 2019' AND 'Sat Jul 20 00:00:00 IST 2019' 
AND date_part('dow', markupdate) in (5,0);

postgres 中的星期日期返回值如下:

0 Sunday
1 Monday
2 Tuesday
3 Wednesday
4 Thursday
5 Friday
6 Saturday

您可以使用更标准的 SQL EXTRACT('dow' FROM markupdate),而不是 date_part('dow', markupdate),但 dow 是扩展,不是 SQL 标准的一部分。

【讨论】:

  • 另外,您应该使用 SQL 标准的日期格式。而不是'Thu Jul 11 00:00:00 IST 2019' 使用'2019-07-11 00:00:00+0530'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-25
  • 1970-01-01
相关资源
最近更新 更多