› 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 · 6724 views
    This topic created in 3287 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
    l00t
    Nov 10, 2017❤️1
    1
    ISOCalendar 看周四的。周四在上一年,这周就算上一年的。周四在这一年,这周就算这一年的。
    wisefree
    wisefree
    OP
    Nov 10, 2017
    2
    @l00t 确实好像是和 ISO 8601 有关,但是有没有一个和 excel weeknum 一样方便的函数呢?
    wisefree
    wisefree
    OP
    Nov 10, 2017
    4
    @ping2 指定 mode,也不会有 weeknum 的效果
    nekuata
    nekuata
    Nov 10, 2017❤️1
    5
    select week(date_add('2017-1-1',interval 7 day),3);
    手动加一周 /滑稽
    wisefree
    wisefree
    OP
    Nov 10, 2017
    6
    @nekuata 好像对所有年份的第一天,并不通用,>_<
    ping2
    ping2
    Nov 10, 2017❤️1
    7
    @wisefree

    > select week('2017-01-01', 2)\G
    *************************** 1. row ***************************
    week('2017-01-01', 2): 1
    1 row in set (0.00 sec)
    nekuata
    nekuata
    Nov 10, 2017❤️1
    8
    @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
    wisefree
    OP
    Nov 10, 2017
    9
    @ping2 可能我表述有问题,2017-01-01 可以达到了 weeknum 的效果

    但是呢?

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

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

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

    select week('2017-01-01', 5) + 1
    wisefree
    wisefree
    OP
    Nov 11, 2017
    17
    @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
    ping2
    Nov 11, 2017❤️1
    18
    @wisefree 现状应该是大部分的后端都只实现 iso week number 和相关的方式。所以完全用 weeknum 的那个方式需要自己实现。
    wisefree
    wisefree
    OP
    Nov 11, 2017
    19
    @ping2 明白了,谢谢啦
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1122 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 17:59 · PVG 01:59 · LAX 09:59 · JFK 12:59
    ♥ Do have faith in what you're doing.