SQL查询日期字符串的范围

时间:2015-03-06 09:18:42

标签: sql postgresql

规范:我需要按日期查询月份和日期(忽略年份)

输入:

start := '2015-12-29'
end := '2016-01-03'

输出:

1986-12-30
1980-01-01
1982-12-31
1978-01-03
...

目前的解决方案:

SELECT *
FROM users
WHERE RIGHT(birthday,5) >= $1
  AND RIGHT(birthday,5) <= $2

但这只适用于年份不重叠的情况,这种情况下最简单的解决方案是什么?

我最简单的解决方案是使用另一种语言生成SQL字符串:

if start_year == end_year {
    date_where = `
    AND RIGHT(birth_date,5) >= RIGHT(` + Z(start) + `,5)
    AND RIGHT(birth_date,5) <= RIGHT(` + Z(end) + `,5)
    `
} else {
    date_where = `
    AND ( RIGHT(birth_date,5) >= RIGHT(` + Z(start) + `,5)
        AND RIGHT(birth_date,5) <= '12-31'
    ) OR ( RIGHT(birth_date,5) >= '01-01'
        AND RIGHT(birth_date,5) <= RIGHT(` + Z(end) + `,5)
    )`
}

我相信还有比这更好的方法..

1 个答案:

答案 0 :(得分:1)

日期不是字符串,不使用字符串函数来处理日期。使用EXTRACT等日期函数:

SELECT  '2015-12-29'::date,
    EXTRACT(month from '2015-12-29'::date),
    EXTRACT(day from '2015-12-29'::date);