› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
wisefree
V2EX  ›  MySQL

mysql 中取得一年的周数,怎样才能和 excel 的 weeknum 函数一致

  •  
  •   wisefree · Nov 10, 2017 · 6571 views
    This topic created in 3246 days ago, the information mentioned may be changed or developed.
    • mysql
    select week('2017-01-01', 3)
    

    得到:52

    • excel

    weeknum("2017-01-01",2) 得到:1

    每一年的第一天,都是第一周,这个逻辑是否可以在 mysql 中实现呢?


    突然发现,python 中 datetime.date(2017, 1,1).isocalendar()[1],得到的也是 52

    蒙圈了。。。请各位大 V 指教

    19 replies  •  2017-11-11 16:40:52 +08:00
    l00t
        1
    l00t  
       Nov 10, 2017   ❤️ 1
    ISOCalendar 看周四的。周四在上一年,这周就算上一年的。周四在这一年,这周就算这一年的。
    wisefree
        2
    wisefree  
    OP
       Nov 10, 2017
    @l00t 确实好像是和 ISO 8601 有关,但是有没有一个和 excel weeknum 一样方便的函数呢?
    wisefree
        4
    wisefree  
    OP
       Nov 10, 2017
    @ping2 指定 mode,也不会有 weeknum 的效果
    nekuata
        5
    nekuata  
       Nov 10, 2017   ❤️ 1
    select week(date_add('2017-1-1',interval 7 day),3);
    手动加一周 /滑稽
    wisefree
        6
    wisefree  
    OP
       Nov 10, 2017
    @nekuata 好像对所有年份的第一天,并不通用,>_<
    ping2
        7
    ping2  
       Nov 10, 2017   ❤️ 1
    @wisefree

    > select week('2017-01-01', 2)\G
    *************************** 1. row ***************************
    week('2017-01-01', 2): 1
    1 row in set (0.00 sec)
    nekuata
        8
    nekuata  
       Nov 10, 2017   ❤️ 1
    @wisefree 加上三目..if 语句大概可以吧 /认真脸
    select if(weekday('2017-01-01') <> 0, week(date_add('2017-1-1', INTERVAL 7 DAY), 3), week('2017-01-01', 3));
    wisefree
        9
    wisefree  
    OP
       Nov 10, 2017
    @ping2 可能我表述有问题,2017-01-01 可以达到了 weeknum 的效果

    但是呢?

    2016-01-01,又有改 mode 么?
    wisefree
        10
    wisefree  
    OP
       Nov 10, 2017
    @nekuata 想不到还挺复杂的,~_~
    ping2
        11
    ping2  
       Nov 10, 2017   ❤️ 1
    @wisefree 你说的那种肯定不对的,因为那样 W1 必然会有七天以上,那样就违背了 week num 的定义。mysql 文档上说得很清楚,你要不选择一种 mode 把指定开头的几天是 W0。
    wisefree
        12
    wisefree  
    OP
       Nov 11, 2017
    @ping2 谢谢啦,我仔细看了下 mysql 文档
    如果我想得到每一年第一天是第 1 周的效果,必须到日历上看看这一年第一天是星期几,然后选择想要的 mode

    其实在 excel 中,并不需要这么复杂
    每一年的第一天,肯定是第 1 周,所以我想要 excel weeknum 函数的效果
    每一年的第一天,是第一周,每一年的第一天直至最近的星期天都是第一周,这更方便。
    ping2
        13
    ping2  
       Nov 11, 2017   ❤️ 1
    wisefree
        14
    wisefree  
    OP
       Nov 11, 2017
    @ping2 对,所以我一般用 excel 中的 weeknum(ex_date, 2),得到周数,基本都是用 system1

    mysql 中有没有实现 excel 里的 system1 的功能呢
    wisefree
        15
    wisefree  
    OP
       Nov 11, 2017
    @ping2 select week('2017-01-01',2),week('2017-01-02',2),week('2017-01-09',2)
    得到 1,1,2
    而我想得到的却是 1,2,3
    ping2
        16
    ping2  
       Nov 11, 2017   ❤️ 1
    @wisefree 这样的效果?

    select week('2017-01-01', 5) + 1
    wisefree
        17
    wisefree  
    OP
       Nov 11, 2017
    @ping2 select week('2014-01-01',3), week('2014-01-06',3),week('2014-01-13',3),是我想要的结果

    但是如果换成 2017 年,这个有问题了,所以每一年的 mode 必须重新考虑选择

    这一点让人有点苦恼。excel weeknum(ex_date, 2)是我需要的返回值
    ping2
        18
    ping2  
       Nov 11, 2017   ❤️ 1
    @wisefree 现状应该是大部分的后端都只实现 iso week number 和相关的方式。所以完全用 weeknum 的那个方式需要自己实现。
    wisefree
        19
    wisefree  
    OP
       Nov 11, 2017
    @ping2 明白了,谢谢啦
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2507 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 11:58 · PVG 19:58 · LAX 04:58 · JFK 07:58
    ♥ Do have faith in what you're doing.