【问题标题】:Remove blank-padding from to_char() output从 to_char() 输出中删除空白填充
【发布时间】:2014-04-10 03:13:58
【问题描述】:

我由此生成一个视图:

create or replace view datetoday as
select to_char(dt, 'yyyy-mm-dd') as date, to_char(dt, 'Day') as weekday from 
(select ('2013-03-01'::date + i) dt from generate_series(0,'2013-03-03'::date - 2013-03-01'::date) 
as t(i)) as t;

它为我提供text 类型的工作日信息。然后我使用:

select date::date, weekday::varchar from datetoday;

现在桌子是这样的

2013-3-1 Friday
2013-3-2 Saturday

如果我要选择条目:

select * from datetoday where weekday='Friday'

将其从 text 更改为 character varying

好像长度是固定的,不是按照每个字长来的。
例如,“星期五”的长度应为 6,星期三的长度应为 9。
我该如何改变这个,让长度为单词的实际长度?

因为稍后我会将这个表的weekday 列与另一个表的weekday 列进行比较。喜欢

where a.weekday=b.weekday

另一个工作日来自jsp的用户,所以长度不同。
现在长度固定了,比较失败。

【问题讨论】:

  • 这没有多大意义。你能显示完整的 SQL 和它的输出吗?
  • 为什么不使用 SELECT EXTRACT(DOW FROM TIMESTAMP dt) 而不是 to_char(dt, 'Day')。这将为您提供星期几(0 - 6;星期日为 0)。然后你就可以比较了。
  • 其他表是工作日信息,例如星期一而不是数字。

标签: sql postgresql database-design date-format generate-series


【解决方案1】:

'Day' 模式在右侧填充空白,使所有天的长度为 9 个字符。使用FM Template Pattern Modifier 删除任何填充:

SELECT d::date AS day
     , to_char(d, 'yyyy-mm-dd') AS day_text
     , to_char(d, 'FMDay')      AS weekday
FROM generate_series('2013-03-01'::date
                   , '2013-03-07'::date
                   , interval '1 day') d;

还演示了generate_series() for timestamps。少一级查询。
如果您需要视图中的实际date,请将其设为实际类型date,不要转换为text 并返回。
并且不要使用基本类型名称date 作为列名。改用day
我只会使用text 作为文本。转换为varchar 没有意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多