2015年12月

中国真正的城市格局

(转自网易)

每天都会在网上看到各种城市排名:GDP排名、房价排名、各种指数排名等等,都是用一堆数据下结论,基本都是泛泛之辈的夸夸其谈,或者人云亦云,毫无可读性。

中国依然处于发展大浪潮当中,城市格局是由经济结构变迁决定的,而且变化日益微妙,如果不能从深层次上分析这个问题,就永远只能停留在“数字”表面。

请记住:在中国“数字”不会带来任何真相的,更说明不了任何本质问题!

中国的真相既不像愤青眼里那么极端,也不像新闻联播里那么堂皇。我每天也在看央视的“新闻联播”和“新闻频道”,但不是用“眼”看,而是用“心”看。你只要用“心”,那些虚荣的信息都会被过滤,入不了你的法眼,剥去一层层外皮,真相就自然呈现。

1中国城市格局

OK,今天我们就来探讨一下中国城市格局的问题。

首先,大家有没有发现一个事实:在中国,凡是沿海的经济发达省份,都会有一个“经济中心”城市,其经济发展水平要比“省会”城市高。自南向北依此为:广东的深圳VS广州、福建的厦门VS福州、江苏的苏州VS南京、山东的青岛VS济南、辽宁的大连VS沈阳。

也就是说,这些省份都有一个“经济中心”和一个“政治中心”,这叫“政商分家”。只有“政治”和“商业”分家了,经济才能真正的发展,这也是中国第一阶段改革开放的成果,沿海省份经济硕果累累。

同时,我们也会发现,凡是经济欠发达的内地省份,本省经济就会出现“省会独大”的经济现象,比如:湖北的武汉、湖南的长沙、四川的成都、安徽的合肥、陕西的西安、山西的太原、新疆的乌鲁木齐、云南的昆明等等。这叫“政商不分”,“政治”和“商业”纠结在一起,这些地方的经济往往是依靠“行政”手段堆砌起来的。

这就是“内地”跟“沿海”的区别,经济结构不一样。“省会一家独大”和“两个城市遥相呼应”相比,很明显后者更具协调性、分工性,当然这也是改革开放的政策倾斜导致的。

而我更想说的是:对于制定政策的领导而言,为什么那么多内地的省级领导依然看不到这个问题呢?

比如安徽,这么多年来一直坚持举全省之力建设一个“合肥”。凡是去过合肥的人都知道,论及外表它算是富丽堂皇了。但是一个省会的富丽堂皇跟该省老百姓的生活水平是没有任何关系!更何况,合肥本地人均收入其实很低,也不能跟其外表成正比。

究其本质,是领导们太喜欢、太在乎自己的家园了,因为他们都是住在“省城”里的。他们难道不明白:要想使一个省的经济水平得到发展,必须“政商分开”,政治的归政治,商业的归商业。选择一个城市作为“经济中心”跟省会遥相呼应,这叫分工明确、定位精准,这样既出政绩,老百姓生活又能提高。乱炖是做不出好菜的!

安徽如此,四川、湖北、湖南、陕西、山西都是如此!OK,现在大家知道为什么有些省会生产很富丽堂皇,而该省的百姓却很穷了吧。所以大家看一个区域的经济发展,不要看新闻、不要看数字、不要看高楼。我感叹的是:如果没有开明的思想,没有足够的大局观,这些地方会一直落后下去!

2中国的大城市

OK,弄懂这个问题。我们再来看看整个中国。

如果把中国看成一个大省份,那么其政治中心就是北京,经济中心就是上海,你看这分工多么明确,所以改革开放才30年就取得了有目共睹的经济成就。

首先,北京和上海到底谁才是中国第一大城市?这个大家不用再争论了,是北京。因为我的几个微信公众平台早就给出了后台分析,北京永远都比上海多大概三分之一左右,当然这里仅从人口多少而论的。

那么,北京因何成为中国第一大城市的呢?

这里就必须有深层次的分析。我们知道,中国城市发展基本上都是改革开放之后才开始的。而中国上一个阶段的改革开放,其发展方式其实就是“权力经济”。

北京,其实是“权力经济”的极端产物。

中国上一个阶段的改革开放,其实不是完全的开放,只是开放了一部分权力,依然有很多权力是没有外放的。因很多地方政府、企业办事都得跑到北京来审批,“驻京办”就这样产生的。全国的钱都往北京送,全国的有钱人都想往里挤,北京房价能不高吗?

同时,北京垄断了全国最得力的资源,包括全国最高端的教育、医院、文化等等资源,一点不愿意不往外放,导致很多人的理想只有在北京才能实现,“北漂”就这样产生的。

这种绝对的优势导致在北京的人心态都是“扭曲”的,在北京随便见一个人,都说自己认识这个认识那个,这也能干那也能干,再大的事到他们嘴里都是小菜一碟。腰里不怀揣着几个亿的项目,都不好意思出来见人。

上帝是公平的。北京享受了全国最优质的资源,也呼吸着全国最肮脏的空气,谁敢说“雾霾”不是上帝赐给北京的特殊礼物?

但是,随着改革开放的深化,中国接下来就将解决权力的问题。李克强总理要就申明了:要把“权力”关在“制度”的笼子里。再加上反腐的强化、审批流程的缩减、政府职能的转变。

中国将迎来下一个崭新的时期:今后的企业家将更加注重创新,而不是搞关系,政府更注重服务和搭建平台,而不是掌控和指挥。

这就是中国上一阶段的经济体制问题,再加上发展速度之快,导致北京之大实数世界罕见,其各项隐患和大城市病,也将随着中国经济结构的再定位而减缓。

全国的钱都往北京送,然后这些钱都送到上海运作。这就是政治中心和是经济中心的区别。准确说上海应该是“金融中心”。

所有的商业模式发展最后,就是钱如何生钱的问题,这就是金融的本质,它位于食物链的最高端,所以上海人均GDP永远是最高的。只要上海的“金融中心”地位不动摇,永远都是最富裕的城市,这是定位决定的。

这些钱运到上海后就需要钱生钱。因此上海的金融公司多如牛毛,在那里最普遍的工作是“理财顾问”和“理财经理”,她们是怎么开拓客户的呢?最开始是去百度做推广,后来是微信摇一摇,最后是去跟大爷大妈一起跳广场舞。

上海人眼里都是钱,所以会更加物质和现实,上海的小资情调和虚荣也是无与伦比的。是一个适合成功之后再来运作和挥霍的地方,它缺乏对成功过程的欣赏,也就是缺乏对勤奋的认可、对年轻人的包容。

而这一点形成了上海最严重的诟病:太缺乏创新和创业精神了,为什么我们要提到这一点,因为这一点才决定着一个区域未来。

这就是深圳和上海的区别。深圳的定位应该是“科技中心”。科技最讲究的是什么?就是创新!

深圳是中国最年轻的城市。如果你想读懂中国历史就去读北京,如果你想读懂中国近代史就去读上海,如果你想读懂中国现代史就去读深圳!

中国电子类、家电类、智能产品往往都分布在这里,深圳的南山,基本上聚集了中国的所有科技巨头,其实要看“中国制造”的水平和前景,就看这座城市的创新能力了。

在深圳的大街上,你很少看到老头老太,整个中国正在老龄化,唯有这座城市依然是年轻人的天下,这其实也是深圳的一个优势条件。

这是中国的三个一线城市,各有各的定位,北京代表的是因为国有资本,上海代表着外资资本,而深圳代表民间资本,三者各司其职。各领风骚。

很多人说一线城市节奏快,压力大。但是一线城市的服务性质和消费结构的完善,却是其他地方不具备的。

另外,在一线城市打拼更多的是依赖你的能力,然后去碰撞各种机会。而在三四线城市,或者你的老家的那个县城,更多的看你的背景和出身,相信这一点很多人深有感触。

3中国“传统产业链

继续详解地域经济格局,我们就必须要弄清一个概念,那就是产业链。中国“传统产业链”是怎么样的呢?

我们以纺织服装为例做一个说明:新疆的“棉花”先运到山东,在山东做成“纱线”,山东的“纱线”再运到“江浙”做成面料,这些面料再运到广东做成“服装”,然后再贴上各大品牌的标签,我们身上的每一件衣服都是这样做出来的。

从“棉花”到“纱线”是初级加工,这是劳动密集型生产,从“纱线”到“面料”是深度加工,需要染色、漂染等各项功能的检测,而从“面料”到“服装”则需要设计师的创意注入,然后才能成为一件衣服。最后就是“品牌”运作,经过品牌方不断的营销和宣传,最终成为各类人群追逐的品牌服装。

大家发现没有,在这条传统的产业链中,从低到高依次是:新疆、山东、江浙、广东,这些区域的经济水平依次递增。

这就是定位决定的,你所处的环节越高,所需要的技术含量就越大,以脑力劳动为主,获得的收益就越高。你所处的环节越低,所需要的技术含量就越低,以体力劳动为主,往往都是粗放型的生产。

从产品角度来说,品牌运作就是产业链的最高环节,比如我们使用的苹果手机,虽然都是富士康生产的,但我们从来不会认为它是“中国制造”的,这就是品牌的神奇之处。这也是中国经济的瓶颈,沦为给别人代加工的地步,处于整个世界产业链的低端环节。

从商业角度来说,金融才是产业链的最高环节。无论是服装这样的快消品,还是服务行业,很多品牌都把总部设立在北京,赚到了钱再送到上海运作(上海股交所)。

中国区域经济格局就是这样来的:

新疆—山东—江浙—广东—北京—上海。

究其本质是这样的:

材料—加工—成品—品牌—金融。

就是这样一个过程,所以有时先天条件更容易决定一个区域的定位,比如几乎所有的“资源强势区域”都处于“经济洼陷区域”。比如内蒙、新疆、山西拥有很多优越的原材料,羊毛、矿产等等自然资源,无论你的养殖、开矿技术做到多么极致,却永远只能处于“资源”这个最低端环节。

而江浙和广东往往其实都是土地的贫瘠之处,他们只有从事商业活动的才能维持生活。这就好比一个人天生拥有“坐享其成”的老本,往往“不思进取”。而一个人如果生下来“一无所有”,必然会产生强烈的创造欲望。

点评:

所以有时候真的不是我们不够努力,而是你生下来就处于某个环节。你的环节定位既跟你的区域有关,也跟你的背景、环境、学识、能力有关。无论你在某个环节做到多么极致,永远还只能停留在这个环节。

比如很多人从技术员做到工程师、高级工程师、特级工程师,依旧还是技术工人······其实很多道理都是如此,真正的改变现状是“跳出去”,这需要你能从更高的高度看待一系列问题。

除了先天条件之外,后天政策也是一大驱动。比如中国的改革开放,其实就是把一些政策给了沿海城市,深圳、厦门、宁波、青岛、大连这五大计划单列市,就是这样产生的。

它们自南向北分布,这种外力性的“政策驱动”在上一个改革开放阶段发挥着巨大作用,极大的影响了中国城市发展格局。

但是,这种“政策驱动”在接下来的格局变化中将逐渐失灵。中国的城市之前是投资驱动,今后必须依靠城市内生驱动力。这也就是使我们说的,中国今后的发展,行政干涉的作用会越来越弱。

比如:1978年邓小平在珠三角的南疆画了一个圈,后来深圳特区现代化的大都市。1990年4月,江泽民在长三角的浦东画了一个圈,后来浦东后成为上海经济的引擎。

2003 年,中国又在河北唐山曹妃甸画了一个380平方公里的圈,辅之以2万人口的首钢整体搬迁。但自2003年启动开发建设以来,累计填海造陆超过230平方公里,总投资超过3000亿元,高峰时期号称日均投资4亿元,一度被称为“中国最大的单体工地”、国家级循环经济示范区。

它不仅承载着唐山城市和产业双重转型的“蓝色之梦”,更被视为重塑京津冀区域发展格局的战略之举。然而大规模的投入建设了十几年之后,这个“圈”却不灵了,曹妃甸陷入鬼城风险,平均每天要偿还的利息高达1000万元!

直到现在,像天津和重庆这种依靠政策介入的城市,依然像“老汉拉车”一般。我们整天看到两座城市的新闻,官方给的GDP数字也很高。但是这些都是表面,其实探讨一个区域或者城市的前景,我们只要推敲一点就可以:这个城市的定位究竟是什么?它有没有内在的张力?

的确,人生来就是不平等的。这一点可怕到你所在的区域也可以成为制约你发展的条件。但是,这一切都已经成为了过去。只有一种力量可以改变世界,它就是互联网!如果没有互联网,中国(包括世界)依然会按照既定的秩序运转,但是互联网的发展,将这一切规则都打乱了,下一个希望又到来了。

比如杭州,杭州是中国电子商务的策源地,并且把电子商务作为支柱产业。这是一个很精准的城市定位。电子商务的本质就是重新制定一套买卖规则,无论产品是谁生产的,我就把最合适的产品第一时间送到最合适的消费者手里,内销有淘宝、天猫,外贸有跨境电商。

电子商务改写了商业格局,包括我们上面讲到的产业链。我为什么要说那是一条“传统产业链”,就是因为在互联网时代它都已经成为了过去。如今一个品牌的诞生完全是另一套逻辑,这里不再详细探讨了。

放眼四望,未来的社会财富不再只是产品,而是数据和信息。谁对接了消费者的需求、谁掌握了消费数据、谁就在书写商业规则,中国倒闭了一批又一批传统企业和传统产业,只能是一阵暂痛而已,就像新生儿即将诞生,总会有临产疼痛一样。

总之,中国的未来依然充满各种变数,城市格局依然会动荡。但有一点不会变,就是定位决定未来。有很多城市定位很模糊,你提到它往往没有什么深刻的印象,这就好比一个人各方面都很平庸,属于泛泛之辈,你怎么看好的它的前程?

还有很多城市摇摆不定,今天说自己领先中部崛起,明天喊着要融入长三角,这就好比当你发现一个人什么都可以干时,其实他什么都干不好。而当你发现一个什么都干不了时,却总有一方面,是什么人都比不了他的地方,只是你还没有发掘到它的潜力!

所以,当我们无数次暗暗立志之时,有没有想过自己为什么而生?

mysql 中 时间和日期函数

一、MySQL 获得当前日期时间 函数

1.1 获得当前日期+时间(date + time)函数:now()

mysql> select now();

+---------------------+
| now() |
+---------------------+
| 2008-08-08 22:20:46 |
+---------------------+

除了 now() 函数能获得当前的日期时间外,MySQL 中还有下面的函数:

current_timestamp()
,current_timestamp
,localtime()
,localtime
,localtimestamp -- (v4.0.6)
,localtimestamp() -- (v4.0.6)

这些日期时间函数,都等同于 now()。鉴于 now() 函数简短易记,建议总是使用 now() 来替代上面列出的函数。

1.2 获得当前日期+时间(date + time)函数:sysdate()

sysdate() 日期时间函数跟 now() 类似,不同之处在于:now() 在执行开始时值就得到了, sysdate() 在函数执行时动态得到值。看下面的例子就明白了:

mysql> select now(), sleep(3), now();

+---------------------+----------+---------------------+
| now() | sleep(3) | now() |
+---------------------+----------+---------------------+
| 2008-08-08 22:28:21 | 0 | 2008-08-08 22:28:21 |
+---------------------+----------+---------------------+

mysql> select sysdate(), sleep(3), sysdate();

+---------------------+----------+---------------------+
| sysdate() | sleep(3) | sysdate() |
+---------------------+----------+---------------------+
| 2008-08-08 22:28:41 | 0 | 2008-08-08 22:28:44 |
+---------------------+----------+---------------------+

可以看到,虽然中途 sleep 3 秒,但 now() 函数两次的时间值是相同的; sysdate() 函数两次得到的时间值相差 3 秒。MySQL Manual 中是这样描述 sysdate() 的:Return the time at which the function executes。

sysdate() 日期时间函数,一般情况下很少用到。

  1. 获得当前日期(date)函数:curdate()

mysql> select curdate();

+------------+
| curdate() |
+------------+
| 2008-08-08 |
+------------+

其中,下面的两个日期函数等同于 curdate():

current_date()
,current_date

  1. 获得当前时间(time)函数:curtime()

mysql> select curtime();

+-----------+
| curtime() |
+-----------+
| 22:41:30 |
+-----------+

其中,下面的两个时间函数等同于 curtime():

current_time()
,current_time

  1. 获得当前 UTC 日期时间函数:utc_date(), utc_time(), utc_timestamp()

mysql> select utc_timestamp(), utc_date(), utc_time(), now()

+---------------------+------------+------------+---------------------+
| utc_timestamp() | utc_date() | utc_time() | now() |
+---------------------+------------+------------+---------------------+
| 2008-08-08 14:47:11 | 2008-08-08 | 14:47:11 | 2008-08-08 22:47:11 |
+---------------------+------------+------------+---------------------+

因为我国位于东八时区,所以本地时间 = UTC 时间 + 8 小时。UTC 时间在业务涉及多个国家和地区的时候,非常有用。
二、MySQL 日期时间 Extract(选取) 函数。

  1. 选取日期时间的各个部分:日期、时间、年、季度、月、日、小时、分钟、秒、微秒

set @dt = '2008-09-10 07:15:30.123456';

select date(@dt); -- 2008-09-10
select time(@dt); -- 07:15:30.123456
select year(@dt); -- 2008
select quarter(@dt); -- 3
select month(@dt); -- 9
select week(@dt); -- 36
select day(@dt); -- 10
select hour(@dt); -- 7
select minute(@dt); -- 15
select second(@dt); -- 30
select microsecond(@dt); -- 123456

  1. MySQL Extract() 函数,可以上面实现类似的功能:

set @dt = '2008-09-10 07:15:30.123456';

select extract(year from @dt); -- 2008
select extract(quarter from @dt); -- 3
select extract(month from @dt); -- 9
select extract(week from @dt); -- 36
select extract(day from @dt); -- 10
select extract(hour from @dt); -- 7
select extract(minute from @dt); -- 15
select extract(second from @dt); -- 30
select extract(microsecond from @dt); -- 123456

select extract(year_month from @dt); -- 200809
select extract(day_hour from @dt); -- 1007
select extract(day_minute from @dt); -- 100715
select extract(day_second from @dt); -- 10071530
select extract(day_microsecond from @dt); -- 10071530123456
select extract(hour_minute from @dt); -- 715
select extract(hour_second from @dt); -- 71530
select extract(hour_microsecond from @dt); -- 71530123456
select extract(minute_second from @dt); -- 1530
select extract(minute_microsecond from @dt); -- 1530123456
select extract(second_microsecond from @dt); -- 30123456

MySQL Extract() 函数除了没有date(),time() 的功能外,其他功能一应具全。并且还具有选取‘day_microsecond’ 等功能。注意这里不是只选取 day 和 microsecond,而是从日期的 day 部分一直选取到 microsecond 部分。够强悍的吧!

MySQL Extract() 函数唯一不好的地方在于:你需要多敲几次键盘。

  1. MySQL dayof… 函数:dayofweek(), dayofmonth(), dayofyear()

分别返回日期参数,在一周、一月、一年中的位置。

set @dt = '2008-08-08';

select dayofweek(@dt); -- 6
select dayofmonth(@dt); -- 8
select dayofyear(@dt); -- 221

日期 ‘2008-08-08′ 是一周中的第 6 天(1 = Sunday, 2 = Monday, …, 7 = Saturday);一月中的第 8 天;一年中的第 221 天。

  1. MySQL week… 函数:week(), weekofyear(), dayofweek(), weekday(), yearweek()

set @dt = '2008-08-08';

select week(@dt); -- 31
select week(@dt,3); -- 32
select weekofyear(@dt); -- 32

select dayofweek(@dt); -- 6
select weekday(@dt); -- 4

select yearweek(@dt); -- 200831

MySQL week() 函数,可以有两个参数,具体可看手册。 weekofyear() 和 week() 一样,都是计算“某天”是位于一年中的第几周。 weekofyear(@dt) 等价于 week(@dt,3)。

MySQL weekday() 函数和 dayofweek() 类似,都是返回“某天”在一周中的位置。不同点在于参考的标准, weekday:(0 = Monday, 1 = Tuesday, …, 6 = Sunday); dayofweek:(1 = Sunday, 2 = Monday, …, 7 = Saturday)

MySQL yearweek() 函数,返回 year(2008) + week 位置(31)。

  1. MySQL 返回星期和月份名称函数:dayname(), monthname()

set @dt = '2008-08-08';

select dayname(@dt); -- Friday
select monthname(@dt); -- August

思考,如何返回中文的名称呢?

  1. MySQL last_day() 函数:返回月份中的最后一天。

select last_day('2008-02-01'); -- 2008-02-29
select last_day('2008-08-08'); -- 2008-08-31

MySQL last_day() 函数非常有用,比如我想得到当前月份中有多少天,可以这样来计算:

mysql> select now(), day(last_day(now())) as days;

+---------------------+------+
| now() | days |
+---------------------+------+
| 2008-08-09 11:45:45 | 31 |
+---------------------+------+

三、MySQL 日期时间计算函数

  1. MySQL 为日期增加一个时间间隔:date_add()

set @dt = now();

select date_add(@dt, interval 1 day); -- add 1 day
select date_add(@dt, interval 1 hour); -- add 1 hour
select date_add(@dt, interval 1 minute); --
select date_add(@dt, interval 1 second);
select date_add(@dt, interval 1 microsecond);
select date_add(@dt, interval 1 week);
select date_add(@dt, interval 1 month);
select date_add(@dt, interval 1 quarter);
select date_add(@dt, interval 1 year);

select date_add(@dt, interval -1 day); -- sub 1 day

MySQL adddate(), addtime()函数,可以用 date_add() 来替代。下面是 date_add() 实现 addtime() 功能示例:

mysql> set @dt = '2008-08-09 12:12:33';

mysql>
mysql> select date_add(@dt, interval '01:15:30' hour_second);

+------------------------------------------------+
| date_add(@dt, interval '01:15:30' hour_second) |
+------------------------------------------------+
| 2008-08-09 13:28:03 |
+------------------------------------------------+

mysql> select date_add(@dt, interval '1 01:15:30' day_second);

+-------------------------------------------------+
| date_add(@dt, interval '1 01:15:30' day_second) |
+-------------------------------------------------+
| 2008-08-10 13:28:03 |
+-------------------------------------------------+

date_add() 函数,分别为 @dt 增加了“1小时 15分 30秒” 和 “1天 1小时 15分 30秒”。建议:总是使用 date_add() 日期时间函数来替代 adddate(), addtime()。

  1. MySQL 为日期减去一个时间间隔:date_sub()

mysql> select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second);

+----------------------------------------------------------------+
| date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second) |
+----------------------------------------------------------------+
| 1997-12-30 22:58:59 |
+----------------------------------------------------------------+

MySQL date_sub() 日期时间函数 和 date_add() 用法一致,不再赘述。另外,MySQL 中还有两个函数 subdate(), subtime(),建议,用 date_sub() 来替代。

  1. MySQL 另类日期函数:period_add(P,N), period_diff(P1,P2)

函数参数“P” 的格式为“YYYYMM” 或者 “YYMM”,第二个参数“N” 表示增加或减去 N month(月)。

MySQL period_add(P,N):日期加/减去N月。

mysql> select period_add(200808,2), period_add(20080808,-2)

+----------------------+-------------------------+
| period_add(200808,2) | period_add(20080808,-2) |
+----------------------+-------------------------+
| 200810 | 20080806 |
+----------------------+-------------------------+

MySQL period_diff(P1,P2):日期 P1-P2,返回 N 个月。

mysql> select period_diff(200808, 200801);

+-----------------------------+
| period_diff(200808, 200801) |
+-----------------------------+
| 7 |
+-----------------------------+

在 MySQL 中,这两个日期函数,一般情况下很少用到。

  1. MySQL 日期、时间相减函数:datediff(date1,date2), timediff(time1,time2)

MySQL datediff(date1,date2):两个日期相减 date1 - date2,返回天数。

select datediff('2008-08-08', '2008-08-01'); -- 7
select datediff('2008-08-01', '2008-08-08'); -- -7

MySQL timediff(time1,time2):两个日期相减 time1 - time2,返回 time 差值。

select timediff('2008-08-08 08:08:08', '2008-08-08 00:00:00'); -- 08:08:08
select timediff('08:08:08', '00:00:00'); -- 08:08:08

注意:timediff(time1,time2) 函数的两个参数类型必须相同。
四、MySQL 日期转换函数、时间转换函数

  1. MySQL (时间、秒)转换函数:time_to_sec(time), sec_to_time(seconds)

select time_to_sec('01:00:05'); -- 3605
select sec_to_time(3605); -- '01:00:05'

  1. MySQL (日期、天数)转换函数:to_days(date), from_days(days)

select to_days('0000-00-00'); -- 0
select to_days('2008-08-08'); -- 733627

select from_days(0); -- '0000-00-00'
select from_days(733627); -- '2008-08-08'

  1. MySQL Str to Date (字符串转换为日期)函数:str_to_date(str, format)

select str_to_date('08/09/2008', '%m/%d/%Y'); -- 2008-08-09
select str_to_date('08/09/08' , '%m/%d/%y'); -- 2008-08-09
select str_to_date('08.09.2008', '%m.%d.%Y'); -- 2008-08-09
select str_to_date('08:09:30', '%h:%i:%s'); -- 08:09:30
select str_to_date('08.09.2008 08:09:30', '%m.%d.%Y %h:%i:%s'); -- 2008-08-09 08:09:30

可以看到,str_to_date(str,format) 转换函数,可以把一些杂乱无章的字符串转换为日期格式。另外,它也可以转换为时间。“format” 可以参看 MySQL 手册。

  1. MySQL Date/Time to Str(日期/时间转换为字符串)函数:date_format(date,format), time_format(time,format)

mysql> select date_format('2008-08-08 22:23:00', '%W %M %Y');

+------------------------------------------------+
| date_format('2008-08-08 22:23:00', '%W %M %Y') |
+------------------------------------------------+
| Friday August 2008 |
+------------------------------------------------+

mysql> select date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s');

+----------------------------------------------------+
| date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s') |
+----------------------------------------------------+
| 20080808222301 |
+----------------------------------------------------+

mysql> select time_format('22:23:01', '%H.%i.%s');

+-------------------------------------+
| time_format('22:23:01', '%H.%i.%s') |
+-------------------------------------+
| 22.23.01 |
+-------------------------------------+

MySQL 日期、时间转换函数:date_format(date,format), time_format(time,format) 能够把一个日期/时间转换成各种各样的字符串格式。它是 str_to_date(str,format) 函数的 一个逆转换。

  1. MySQL 获得国家地区时间格式函数:get_format()

MySQL get_format() 语法:

get_format(date|time|datetime, 'eur'|'usa'|'jis'|'iso'|'internal'

MySQL get_format() 用法的全部示例:

select get_format(date,'usa') ; -- '%m.%d.%Y'
select get_format(date,'jis') ; -- '%Y-%m-%d'
select get_format(date,'iso') ; -- '%Y-%m-%d'
select get_format(date,'eur') ; -- '%d.%m.%Y'
select get_format(date,'internal') ; -- '%Y%m%d'
select get_format(datetime,'usa') ; -- '%Y-%m-%d %H.%i.%s'
select get_format(datetime,'jis') ; -- '%Y-%m-%d %H:%i:%s'
select get_format(datetime,'iso') ; -- '%Y-%m-%d %H:%i:%s'
select get_format(datetime,'eur') ; -- '%Y-%m-%d %H.%i.%s'
select get_format(datetime,'internal') ; -- '%Y%m%d%H%i%s'
select get_format(time,'usa') ; -- '%h:%i:%s %p'
select get_format(time,'jis') ; -- '%H:%i:%s'
select get_format(time,'iso') ; -- '%H:%i:%s'
select get_format(time,'eur') ; -- '%H.%i.%s'
select get_format(time,'internal') ; -- '%H%i%s'

MySQL get_format() 函数在实际中用到机会的比较少。

  1. MySQL 拼凑日期、时间函数:makdedate(year,dayofyear), maketime(hour,minute,second)

select makedate(2001,31); -- '2001-01-31'
select makedate(2001,32); -- '2001-02-01'

select maketime(12,15,30); -- '12:15:30'

五、MySQL 时间戳(Timestamp)函数

  1. MySQL 获得当前时间戳函数:current_timestamp, current_timestamp()

mysql> select current_timestamp, current_timestamp();

+---------------------+---------------------+
| current_timestamp | current_timestamp() |
+---------------------+---------------------+
| 2008-08-09 23:22:24 | 2008-08-09 23:22:24 |
+---------------------+---------------------+

  1. MySQL (Unix 时间戳、日期)转换函数:

unix_timestamp(),
unix_timestamp(date),
from_unixtime(unix_timestamp),
from_unixtime(unix_timestamp,format)

下面是示例:

select unix_timestamp(); -- 1218290027
select unix_timestamp('2008-08-08'); -- 1218124800
select unix_timestamp('2008-08-08 12:30:00'); -- 1218169800

select from_unixtime(1218290027); -- '2008-08-09 21:53:47'
select from_unixtime(1218124800); -- '2008-08-08 00:00:00'
select from_unixtime(1218169800); -- '2008-08-08 12:30:00'

select from_unixtime(1218169800, '%Y %D %M %h:%i:%s %x'); -- '2008 8th August 12:30:00 2008'

  1. MySQL 时间戳(timestamp)转换、增、减函数:

timestamp(date) -- date to timestamp
timestamp(dt,time) -- dt + time
timestampadd(unit,interval,datetime_expr) --
timestampdiff(unit,datetime_expr1,datetime_expr2) --

请看示例部分:

select timestamp('2008-08-08'); -- 2008-08-08 00:00:00
select timestamp('2008-08-08 08:00:00', '01:01:01'); -- 2008-08-08 09:01:01
select timestamp('2008-08-08 08:00:00', '10 01:01:01'); -- 2008-08-18 09:01:01

select timestampadd(day, 1, '2008-08-08 08:00:00'); -- 2008-08-09 08:00:00
select date_add('2008-08-08 08:00:00', interval 1 day); -- 2008-08-09 08:00:00

MySQL timestampadd() 函数类似于 date_add()。

select timestampdiff(year,'2002-05-01','2001-01-01'); -- -1
select timestampdiff(day ,'2002-05-01','2001-01-01'); -- -485
select timestampdiff(hour,'2008-08-08 12:00:00','2008-08-08 00:00:00'); -- -12

select datediff('2008-08-08 12:00:00', '2008-08-01 00:00:00'); -- 7

MySQL timestampdiff() 函数就比 datediff() 功能强多了,datediff() 只能计算两个日期(date)之间相差的天数。
六、MySQL 时区(timezone)转换函数

convert_tz(dt,from_tz,to_tz)

select convert_tz('2008-08-08 12:00:00', '+08:00', '+00:00'); -- 2008-08-08 04:00:00

时区转换也可以通过 date_add, date_sub, timestampadd 来实现。

select date_add('2008-08-08 12:00:00', interval -8 hour); -- 2008-08-08 04:00:00
select date_sub('2008-08-08 12:00:00', interval 8 hour); -- 2008-08-08 04:00:00
select timestampadd(hour, -8, '2008-08-08 12:00:00'); -- 2008-08-08 04:00:00

ProcessMaker 概念

原文在这,有些不好理解,翻译为简体,ProcessMaker实际上是比较适合中国人使用的工作流引擎,工作流引擎的比较将来结合使用经验会有个比较,计划将ProcessMaker结合进Thinkphp。

学习ProcessMaker的第一步,是了解ProcessMaker中使用到的一些名词。基本上,ProcessMaker是与BPMN相容的,许多定义也是与BPMN标准相同,若您使用过BPMN相容的流程工具,下面很多名词与观念应该可以很容易了解。

一 流程定义(Process)

一个流程(Process),可对应到一个业务流程,是一些工作阶段(Task)的集合,这些工作阶段有一个或多个输入与输出,流程的输出可能是一个有形的物品或服务

二 流程实例(Case)

一个桉件(Case),是流程定义的一个实例,一个商业桉件(Business Case)可以说是一个进行中的工作(Word in Progress)。一个桉件就是执行一个流程的过程。一个桉件从开始到结束都使用相同的桉件编号。

三 流程实例变量(Case Variables)

桉件变数是ProcessMaker桉件执行过程中存放资讯的特殊变数,只有在桉件执行的过程中才有效。在动态输入表格(Dynaform)中的每一个栏位,如textboxes, checkboxes, dropdown boxes与grid objects等,都有一个相关的桉件变数,与该栏位名称相同,且会存放使用者在栏位中输入的值。当使用者在Dynaform中按下Submit按钮(或"下一步"连结)后,每个栏位对应的桉件变数就会被建立用来存放输入的值。

四 节点定义(Task)

一个关卡(Task)是一系列有相同目的的工作步骤(Steps)的组合。而关卡的集合形成一个流程。一个关卡(Task)与一个活动(activity)有点不同,一个活动(activity)是一个关卡(Task)的实例。关卡相对与活动就类似流程相对于桉件。 关卡与流程是定义,活动与桉件是实例(实际进行的工作)。

五 动态表格-节点视图(Dynaform)

Dynaform也称为Dynamic Forms,是在ProcessMaker中设计客製的输入表格,用来在桉件执行过程中与使用者互动的界面。Dynaform让使用者以图形化的界面查看与输入资料,在设计上,对任何使用者应该要直觉好用。

六 业务表单(Master Dynaform)

主动态表格用来呈现单笔记录,栏位预设是垂直排列的。 主动态表格是独立的表格,不可以嵌入到其它的表格中。

七 框格(Grid)

框格表格(Grid Form)用来呈现多笔记录,每一笔记录的栏位以水平方向排列,一笔记录一列。Grid form也可以使用特殊的彙整功能,如合计(sum)来进行特定栏位的加总计算。

八 插件(Plugin)

插件用来增加ProcessMaker额外的功能,或客製化界面与资料库。

九 流程图(Process Map)

流程图是商业流程各工作阶段与引导法则(如上个工作阶段到下个工作阶段的条件)的视觉表示法. Admin可以直接从流程图增加新的或修改现有的桉件与引导法则。

十 权限(Permissions)

赋予使用者或群组存取ProcessMaker特定元件(如文件,Dashboard, Case Notes)的法则(rule)。

十一 流程权限(Process Permissions)

流程权限用来给予使与者或群组对桉件或桉件中的物件(如DynaForms, Input Documents and Output Documents)唯读的权限 . 预设只有流程指定的使用者可以开启相关个桉. 为了允许其他使用者可以看到(但不能变更)桉件中的资料, 可以指定流程权限 给这些使用者. 流程权限也提供进阶的控制功能,设定其他使用者可以查看的是某些特定关卡的资讯.

十二 流程总管(Process Supervisor)

一个流程的流程总管有权检视该流程所有的桉件(Cases)。 通常一个组织的经理或部门主管会被指定为某个流程的总管。流程总管可以给定所有个桉读与写的权限。

十三 角色(Roles)

角色包含对ProcessMaker中特定范围,特定功能的权限。基本上ProcessMaker包含三种角色 PROCESSMAKER_ADMIN, PROCESSMAKER_MANAGER和PROCESSMAKER_OPERATOR, 这些角色可以设定存取 ADMIN 选单, Users tab等功能的权限.

十四 步骤(Steps)

一个步骤(Steps)是一个清楚定义的动作(action)。可能是人工的动作或自动化的动作。 一个关卡(Task)由一个或多个步骤所组成。例如: 上传一份文件,填写一个Dynaform, 下载一份PDF or DOC文件。

十五 事件(Events)

流程中多数的动作是由使用者手动执行。但某些动作需要在特定的时间执行. 在ProcessMaker中, 事件(events) 就是在一个工作阶段或一系列的工作阶段开始或结束时才能执行的行动(actions) , 因此事件需要排程器cron做正确的设定. 因为事件与工作阶段的运作紧密相关, 它们只有在工作阶段尚未结束时才能执行. 如果选定的工作已经完成(或这个个桉被暂停/取消或删除),这事件就不会执行.

事件可能是传送邮件讯息或执行一个trigger. 2.0版后增加了第三个事件"条件事件", 条件事件根据特定桉件的状态来执行. 注: 事件必须从第二个关卡以后(含)才能执行。

/* * @Author: your name * @Date: 2016-09-06 00:00:00 * @LastEditTime: 2020-03-17 18:29:35 * @LastEditors: Please set LastEditors * @Description: In User Settings Edit * @FilePath: \htdocs\usr\themes\default\footer.php */