当前位置:首页 > 问答 > 正文

后浪云OceanBase教程里讲的那个日期字面量怎么用,感觉挺重要但又有点绕

什么是日期字面量?

简单讲,日期字面量就是直接在SQL语句里写死的日期或时间值,它不是从一个表里查出来的,也不是一个变量,而是你明确键入的一串字符,用来表示一个特定的时间点。

你想查询所有在“2023年国庆节”之后入职的员工,你的SQL语句里就不可能去现算国庆节是哪天,而是直接把 '2023-10-01' 这个值写在查询条件里,这个 '2023-10-01' 就是一个最典型的日期字面量

为什么感觉“绕”?——关键在于格式

“绕”的地方主要在于,你不能随心所欲地写日期,比如你写成'2023/10/1''01-Oct-2023'或者'20231001',OceanBase可能不认识,会报错,它必须遵循一套约定的格式才能被正确识别。

教程里强调,OceanBase(和标准SQL类似)主要支持以下几种类型的日期时间字面量,每种都有其标准格式:

日期字面量(DATE) 这是最常用的,只包含年、月、日。

后浪云OceanBase教程里讲的那个日期字面量怎么用,感觉挺重要但又有点绕

  • 标准格式'YYYY-MM-DD'
  • 例子
    • '2023-05-15' 表示2023年5月15日。
    • '1999-12-31' 表示1999年12月31日。
  • 要点
    • 年份通常用4位数,如果用2位数,OceanBase会根据规则进行转换(比如'23-05-15'可能被理解为2023-05-15),但为了避免混淆,强烈建议总是使用4位数的年份
    • 月和日如果是个位数,前面必须补零'2023-5-5'是错误的,必须写成 '2023-05-05'
    • 必须用单引号括起来。

时间字面量(TIME) 这个表示一天中的某个时间,精确到秒或更小。

  • 标准格式'HH:MI:SS[.fraction]'
  • 例子
    • '14:30:00' 表示下午2点30分整。
    • '09:05:45.123456' 表示上午9点5分45秒又123456微秒。
  • 要点
    • 小时是24小时制。
    • 分和秒是个位数时需要补零。
    • 小数部分(微秒)是可选的,用小数点分隔。

日期时间字面量(DATETIME) 这是前两者的结合,既有日期又有时间。

  • 标准格式'YYYY-MM-DD HH:MI:SS[.fraction]'
  • 例子
    • '2023-05-15 14:30:00' 表示2023年5月15日下午2点30分。
    • '1999-12-31 23:59:59.999999' 表示1999年最后一秒的末尾。
  • 要点
    • 日期和时间部分中间必须有一个空格
    • 其他规则和日期、时间字面量一样。

时间戳字面量(TIMESTAMP) TIMESTAMP和DATETIME在格式上看起来一模一样,都是 'YYYY-MM-DD HH:MI:SS[.fraction]',它们的主要区别在于内部存储和时区处理方式,但对于字面量的写法来说,规则是相同的,你把它当成DATETIME来写一般不会错。

怎么用?——最常见的场景:在WHERE子句中过滤数据

日期字面量最大的用处就是作为查询条件,我们开头的那个例子:

后浪云OceanBase教程里讲的那个日期字面量怎么用,感觉挺重要但又有点绕

SELECT * FROM employees WHERE hire_date > '2023-10-01';

这条语句的意思就是从employees表中找出所有入职日期在2023年10月1日之后的员工记录,这里的 '2023-10-01' 就是日期字面量的典型应用。

再举一个带时间的例子,查询在某个具体时间点之后下的订单:

SELECT order_id FROM orders WHERE create_time > '2023-05-15 10:00:00';

如果我的格式不标准怎么办?——使用STR_TO_DATE函数

教程里肯定会提到这个非常重要的函数,它是解决“绕”的钥匙,如果你的日期字符串不是标准格式,比如是'15/05/2023'(日/月/年),OceanBase无法直接识别,你就可以用STR_TO_DATE函数来告诉它如何解读。

基本用法STR_TO_DATE('日期字符串', '格式说明符')

后浪云OceanBase教程里讲的那个日期字面量怎么用,感觉挺重要但又有点绕

  • 例子:把 '15/05/2023' 转换成日期。

    SELECT STR_TO_DATE('15/05/2023', '%d/%m/%Y');

    这里,%d代表两位数的日,%m代表两位数的月,%Y代表四位数的年,这个函数会返回一个OceanBase能理解的日期值。

  • 实际应用

    SELECT * FROM orders WHERE order_date = STR_TO_DATE('15/05/2023', '%d/%m/%Y');

反过来,也有一个DATE_FORMAT函数,可以把数据库里的日期按照你想要的格式输出成字符串,这在做报表时非常有用。

总结一下要点

  1. 重要性:日期字面量是SQL查询中过滤时间条件的基础,无处不在。
  2. “绕”的点:在于必须严格遵守'YYYY-MM-DD''YYYY-MM-DD HH:MI:SS'这样的标准格式,不能自己想当然。
  3. 解决之道:如果数据源格式不标准,牢记使用STR_TO_DATE('字符串', '格式')函数进行转换。
  4. 良好习惯:总是使用4位年份,个位数的月日时分秒前面补零,并用单引号将整个字面量括起来。

多练习在WHERE子句里使用这些字面量,或者用STR_TO_DATE函数转换一些非常规格式的日期,很快就能熟悉了。