SQL 中 date 与datetime的区别

Date和datetime...说实话,这俩在SQL里是两个不同的类型。

Date就一个日期...年月日。
比如你存生日,就存Date类型的。
MySQL里格式是'YYYY-MM-DD',就是这么写的。
我之前搞系统,有时候文件名里要带日期,就自动取系统当前日期,可能就只显示'2 02 3 -03 -1 5 '这种,年月日都全。

DateTime就不一样了,日期+时间,年月日小时分钟秒都存。
MySQL里格式是'YYYY-MM-DDHH:mm:ss',比如'2 02 3 -03 -1 5 1 4 :3 0:00'。
你要是记录啥操作具体时间,就得用DateTime。
我当时做订单系统,订单创建时间就得用DateTime,不能只写日期。

不过用的时候要注意,虽然都是SQL,但不同数据库比如MySQL、Oracle、SQL Server,具体实现可能不一样。
比如DateTimePicker控件,可能在.NET里是这样用,转到其他平台可能要改代码。

反正选哪个,就看你要存啥。
要光日期就选Date,要日期时间就选DateTime。
简单说,精确到天选Date,精确到秒选DateTime。

sql 里怎么把varchar转成datetime格式

说实话,处理这种varchar混着日期和不相关字符的情况,确实得费点心思。
我之前在银行系统遇到过类似场景,客户上传的文本文件里,交易时间后面总跟着一堆乱码。

你看这个例子:'2 01 6 -05 -02 1 2 :00:1 2 fdas',直接CAST肯定不行,SQL会报错说格式不匹配。
这时候就得先想办法把日期部分提出来。
我一般习惯用Substring+CharIndex组合拳。

比如你这样写: sql SELECT CAST(SUBSTRING('2 01 6 -05 -02 1 2 :00:1 2 fdas', 1 , 1 9 ) AS DATETIME) AS converted_date
这里1 9 是个关键数字,它是从第一个字符到'fdas'之前总共有多少个字符。
这个长度数字需要你根据实际数据预处理过才能定死。
我有个客户,他们日期后面固定跟2 0个字符乱码,我就用2 0。
这个数字要是错了,转换出来的时间就乱套。

有意思的是,有时候更麻烦的是边界问题。
比如某个字段里混着'2 01 6 -05 -02 1 2 :00:1 2
1 3 :4 5 :00 some text',这时候单纯截取1 9 个字符就不够了,可能得先用Replace把'
'替换掉,再截取。

说到SQL,我当年刚入行的时候还搞不清它为啥叫Structured Query Language。
后来有个前辈跟我说,想象一下你在超市查商品,你不用管货架上商品是怎么堆放的,你只需要说"给我找草莓",收银员就能找到。
SQL就是这种思维,你不用管数据库底层是堆叠还是索引,你直接说"给我找'2 01 6 -05 -02 '的所有交易记录",它就能给你结果。

不过话说回来,SQL这东西确实有它的局限性。
我碰到过一次超大数据量查询,几百G的表直接用原生SQL跑,CPU直接干烧。
最后还是得靠临时表+索引+批处理分块才能搞定。
这块我没亲自跑过大数据量,数据我记得是X左右,但建议你核实。

最后提个细节,截取字符串的时候,如果源数据里有可能存在空值或者NULL,最好加个ISNULL或COALESCE处理一下,不然整个查询可能就挂了。