PostgreSQL转换日期(YYYY-WW)与MySQL('%x-%v')

时间:2018-02-08 14:26:40

标签: mysql postgresql date-conversion

我试图将查询从MySQL转换为PostgreSQL。结果略有不同,因为看起来这两种语言在一年中定义一周的时间与这些日期之间存在差异。

相同的逻辑给出了不同的日期结果:

PostgreSQL语法 -

select date from sales where to_char(date, 'YYYY-WW') >= '2017-51' AND to_char(date, 'YYYY-WW') <= '2017-52'

MySQL语法 -

select date from sales where 
    DATE_FORMAT(date, '%x-%v') >='2017-51' and DATE_FORMAT(date, '%x-%v') <='2017-52'

当我查询PostgeSQL时,结果为2017-12-17: 2017-12-24。 MySQL结果为2017-12-18: 2017-12-25

为什么会有区别?

1 个答案:

答案 0 :(得分:2)

https://www.postgresql.org/docs/10/static/functions-formatting.html

  

WW周数(1-53)(第一周从第一天开始   年度)

https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

  

%v周(01..53),其中星期一是一周的第一天

所以这种行为是预期的,因为对于postgres

t=# select to_char('2017-12-17'::date,'Day'), to_char('2017-12-17'::date,'WW');
  to_char  | to_char
-----------+---------
 Sunday    | 51
(1 row)

,因为:

t=# select to_char('2017-01-01'::date,'Day'), to_char('2017-01-01'::date,'WW');
  to_char  | to_char
-----------+---------
 Sunday    | 01
(1 row)

while for MySQL

select DATE_FORMAT('2017-01-01', '%x-%v');

2016-52

因此2017-12-17为周50