【问题标题】:How can I extract a weekday from a timestamp in postgresql?如何从 postgresql 中的时间戳中提取工作日?
【发布时间】:2020-01-25 17:13:14
【问题描述】:

我有一个名为 timestamps 的小表,里面只有一个变量 ts:

ts
1541990258796
1541990258312
1541990258367
<...>

基于时间戳表的 ts 值,我想创建一个 factTime 表,从这些 ts 值中提取小时、日和工作日。我目前的查询是这样,并且有效。

time_table_insert = (
    """
    INSERT INTO factTime (start_time, hour, day_of_month, weekday)
    SELECT DISTINCT ts AS start_time,
        EXTRACT(HOUR FROM start_time) AS hour,
        EXTRACT(DAY FROM start_time) AS day_of_month,
        EXTRACT(DOW FROM start_time) AS weekday
FROM (SELECT DISTINCT ts,'1970-01-01'::date + ts/1000 * interval '1 second' as start_time FROM timestamps);
""")

现在我用 DOW 插入一个以数字表示的工作日。有没有办法提取它的实际名称?我应该如何更改查询以获取实际的工作日,即星期一、星期五等。

【问题讨论】:

标签: sql postgresql


【解决方案1】:

你可以这样做:

to_char('1970-01-01'::date + 1541990258312/1000 * interval '1 second', 'day')

我在您的代码中使用了'1970-01-01'::date + 1541990258312/1000 * interval '1 second' - 您获得 start_time 的方式。

使用带有“day”参数的to_char 函数。 您还可以使用其他日期参数:

DAY 完整的大写日期名称(空格填充为 9 个字符)

Day 全大写日期名称(空格填充为 9 个字符)

day 完整的小写日期名称(空白填充到 9 个字符)

在这里你可以看到所有三种方式的结果:DEMO

【讨论】:

  • 嗨@LinaLinutina,我希望这个答案能帮助你解决你的问题。我只想向您说明一件小事:我从您之前的问题中注意到您没有接受其中任何一个,我不知道您是否放弃投票......这样做会很好,那些帮助您欣赏这一点。您可以这样做:stackoverflow.com/help/someone-answers
  • 感谢您的评论。我确实从未接受过答案。很高兴知道未来:)
  • @LinaLinutina 欢迎您。乐意效劳。我的回答按照您的要求给了您一个日期名称,对吗?不正确?
【解决方案2】:

使用日期算术转换为时间戳,然后使用extract()

select extract(dow from '1970-01-01'::timestamp + ts * interval '1 millisecond')

如果您确实想要缩写而不是数字,请使用 to_char()

【讨论】:

    猜你喜欢
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多