选择两列中的月份

时间:2017-10-27 05:35:10

标签: sql postgresql

如何在两个不同的日期列中选择月份?我的原始表就像

id occured_at                  expire_at
1  2017-03-17 10:21:22.935278  2017-04-17 10:21:22.935278
2  2017-04-24 10:21:22.93851   
3  2017-04-27 10:21:22.941801  2017-05-77 10:21:22.941801
4  2017-09-17 10:21:22.941801  2017-10-17 10:21:22.941801

我希望在2017-04中选择occured_atexpire_at,并将日期截断为年份和月份,结果就像

id occured_at                  expire_at
1  2017-03                     2017-04
2  2017-04   
3  2017-04                     2017-05

我是sql的新手。如果有人能提供帮助,我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

显示您想要的日期,请使用#!/bin/bash spinner () { local SP_WIDTH="${3:-1.1}" local SP_DELAY="${4:-.2}" local SP_STRING=${2:-'/-\|'} local SP_COLOR=0 tput civis while [ -d /proc/$1 ]; do printf "\e[38;5;$((RANDOM%257))m %${SP_WIDTH}s\r\e[0m" "$SP_STRING" sleep $SP_DELAY SP_STRING=${SP_STRING#"${SP_STRING%?}"}${SP_STRING%?} done tput cnorm } sleep 7 & spinner "$!" 。您可以使用几种不同方式限制行数:

使用date_trunc:

to_char()

或者您可以使用比较格式化的字符串:

select id, 
       to_char(occurred_at, 'yyyy-mm') as occurred_at,
       to_char(expire_at, 'yyyy-mm') as expire_at
from the_table
where date_trunc('month', occured_at) = date '2017-04-01'
   or date_trunc('month', expire_at) = date '2017-04-01';

或者您可以使用范围查询:

select id, 
       to_char(occurred_at, 'yyyy-mm') as occurred_at,
       to_char(expire_at, 'yyyy-mm') as expire_at
from the_table
where to_char(occured_at, 'yyyy-mm') = '2017-04'
   or to_char(expire_at, 'yyyy-mm') = '2017-04';

最后一个查询能够在这些列上使用索引。对于前两个查询,您需要在使用的表达式上定义表达式索引。