我有一个跨越数年的大型数据集,我在收到诸如“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组?
答案 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);
};