MySQL选择周数和年份会导致一年中的最后一周出现问题

时间:2017-03-23 14:07:17

标签: mysql sql-date-functions

我有一个跨越数年的大型数据集,我在收到诸如“53-2016”(2016年第53周)等字符串时遇到问题。

我的查询是:

SELECT 
  date,
  DATE_FORMAT(date, "%v-%Y") AS week,      
FROM myTable
GROUP BY week
ORDER BY date;

使用这个查询我得到两行,我想只有一行。

这是因为GROUP BY week。在2015年底,日期:12月28日至31日将添加到第53-2015周,其余时间(1月1日至3日)将添加到53-2016行。

有什么方法可以将1月的前三天添加到53-2015组?

3 个答案:

答案 0 :(得分:1)

我最终自己搞清楚了。

原来,MySQL有第二种方式在DATE_FORMAT()打印年份。

  

%x - 星期一是星期的第一天的四周,四位数,与%v一起使用

这解决了问题,我的查询结果如下:

SELECT 
  date,
  DATE_FORMAT(date, "%v-%x") AS week,      
FROM myTable
GROUP BY week
ORDER BY date;

答案 1 :(得分:0)

是的,你可以这样做。 请执行以下操作

SELECT 
  date,
  DATE_FORMAT(DATE_SUB(date, INTERVAL MOD(DAYOFWEEK(`date`) +5,7) DAY ), "%v-%Y") AS week
FROM myTable
GROUP BY week
ORDER BY date;

这将查询星期几,并将减去天数,因此每天基本上被截断为上一个星期一

答案 2 :(得分:0)

这样的事情(做更多测试......)?

    date    week
1   31.12.2015 00:00:00 53-2015
2   01.01.2016 00:00:00 53-2015

输出:

#define USART_DEBUG
#define DEBUG_BUF_SIZE 30

__attribute__((__interrupt__))
void UartISR_forWebserver()
{ 
  uint8_t rec_byte;
#ifdef USART_DEBUG  
  static volatile uint8_t usart_debug_buf[DEBUG_BUF_SIZE]; //circular buffer for debugging
  static volatile int usart_debug_buf_index = 0;
#endif      

  rec_byte = (uint8_t)((&AVR32_USART0)->rhr & 0x1ff);

#ifdef USART_DEBUG  
  usart_debug_buf_index = usart_debug_buf_index % DEBUG_BUF_SIZE; 
  usart_debug_buf[usart_debug_buf_index] = rec_byte;
  usart_debug_buf_index++

  if (!(usart_debug_buf_index < DEBUG_BUF_SIZE)) {
    usart_debug_buf_index = 0; //candidate for a breakpoint to see what happened in the past
  }
#endif
  //uart_recfifo_enqueue(rec_byte);

};