首页 > 解决方案 > 将星期几与星期几的字符串文字名称进行比较返回 false

问题描述

我正在将星期几的值与其字符串文字等价物进行比较,但我一直得到false. 我在 SQL Fiddle 中有一个相对简单的字符串 DoW 到“星期一”比较设置,但是,只有 DoW 到 int 比较有效。我计划继续使用它,但我试图了解失败的原因。

http://sqlfiddle.com/#!17/2d52d/29

day1 like day2 AS like_compare,       //Expect true,  get false
day1 = day2 AS equal_compare,         //Expect false, get false
day1::text like day2 AS text_compare, //Expect true,  get false
EXTRACT(DOW FROM '2019-08-05') = 1 AS value_compare //Expect true, get true

我试图了解导致 PostgreSQL 以这种方式行事的原因。正如您在小提琴中看到的那样,相关的字符串文字都没有“未知”类型。我接受比较星期几的正确方法是使用“值”比较,但是,这并不能解释“喜欢”和“文本”比较发生了什么。

标签: postgresqldate

解决方案


差异源于 extract 和 to_char 处理 Day/DOW 请求的方式略有不同。请参阅EXTRACT DOWTO_CHAR。在这种特殊情况下,请在第 1 天尝试修剪。

WITH mySelect AS 
(  SELECT
      to_char(day1, 'day') AS day1,
      day2 
   FROM
      myTable
)
SELECT
   *,
   pg_typeof(day1)::text like pg_typeof(day2)::text AS types_match,   
   trim(day1) like day2 AS like_compare,
     trim(day1) = day2 AS equal_compare,
     trim(day1::text) like day2 AS text_compare,
     EXTRACT(DOW FROM( SELECT day1  FROM myTable)) = 1 AS value_compare,
     CAST('monday' AS text) like CAST('monday' AS text) AS sanity_compare 
FROM
   mySelect;

推荐阅读