SQL知識大全(五):SQL中的時間函數

2021-03-02 數據萬花筒

今天是SQL知識大全的第五講,主要內容是和時間函數相關,主要包括了常用的時間函數,時間提取函數,時間計算函數以及時間和時間戳之間的轉換。

to_date()函數

to_date()函數將字符串的日期轉換為時間格式的日期,轉換後的時間格式可以是如下形式:

格式
意義
YEAR 年的拼寫MM 數字月MONTH 月的全拼MON 月的縮寫DD 數字日DAY 星期的全拼DY 星期的縮寫AM 表示上午或者下午HH24、HH12 12小時制或24小時制‍MI 分鐘‍‍SS 秒鐘‍‍‍

具體示例如下:

SELECT TO_DATE('2006-05-01 19:25:34', 'YYYY-MM-DD HH24:MI:SS') FROM DUAL
SELECT TO_DATE('2006-05-01 19:25', 'YYYY-MM-DD HH24:MI') FROM DUAL
SELECT TO_DATE('2006-05-01 19', 'YYYY-MM-DD HH24') FROM DUAL
SELECT TO_DATE('2006-05-01', 'YYYY-MM-DD') FROM DUAL
SELECT TO_DATE('2006-05', 'YYYY-MM') FROM DUAL
SELECT TO_DATE('2006', 'YYYY') FROM DUAL

current_date()/current_time()

返回當前時間,某年某月某日,current_time()等同於current_date。

current_timestamp()

current_timestamp()相當於now(),返回當前的時間戳。

時間提取函數包括year(),month(),day(),hour(),minute(),second()等,其用法都是一直的,這些函數分別返回 date 的年份,月份,日期,時間等,範圍為1000-9999。當 date 為0時,返回0。

具體示例如下:

SELECT YEAR('98-02-03')SELECT MONTH('98-02-03')SELECT DAY('98-02-03')

語法:DATEDIFF(expr1,expr2)

DATEDIFF()將返回expr1 - expr2的值,用來表示兩個日期相差的天數。expr1 和 expr2 都是日期或日期時間表達式。運算中只用到了這些值的日期部分。

SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30')
1

date_sub()/date_add()

語法格式:

DATE_ADD(date,INTERVAL expr unit) 

DATE_SUB(date,INTERVAL expr unit)

執行日期計算的兩種函數。date 是一個用來指定開始日期的 DATETIME 或 DATE 值。expr 是一種以字符串形式呈現的表達式,用來指定從開始日期增加或減少的間隔值。如果是負的間隔值,則 expr 值的第一個字符是-號。unit 是一個單位關鍵字,用來指定expr表達式應該採取的單位。

INTERVAL 關鍵字與單位說明符都不區分大小寫。

下表列出了每個單位數值所對應的 expr 參數的期望格式。

單位所能取的值期望的expr格式MICROSECOND毫秒SECOND秒MINUTE分HOUR小時DAY日WEEK周MONTH月QUARTER季度YEAR年SECOND_MICROSECOND'秒.毫秒'MINUTE_MICROSECOND'分.毫秒'MINUTE_SECOND'分:秒'HOUR_MICROSECOND'小時.毫秒'HOUR_SECOND'小時:分:秒'HOUR_MINUTE'小時:分'DAY_MICROSECOND'日.毫秒'DAY_SECOND'日 小時:分:秒'DAY_MINUTE'日 小時:分'DAY_HOUR'日 小時'YEAR_MONTH'年-月'

時間戳的定義

時間戳是從1970年1月1日(UTC/GMT的午夜)開始所經過的秒數,不考慮閏秒。

UNIX時間戳的0按照ISO 8601規範為 :1970-01-01T00:00:00Z.

一個小時表示為UNIX時間戳格式為:3600秒;一天表示為UNIX時間戳為86400秒,閏秒不計算。

在大多數的UNIX系統中UNIX時間戳存儲為32位,這樣會引發2038年問題或Y2038。

UNIX_TIMESTAMP(date)

若無參數調用,則返回一個 Unix timestamp ('1970-01-01 00:00:00' GMT 之後的秒數) 作為無符號整數,得到當前時間戳 。

 

若用date 來調用 UNIX_TIMESTAMP(),它會將參數值以'1970-01-01 00:00:00' GMT後的秒數的形式返回。date 可以是一個 DATE 字符串、一個 DATETIME字符串、一個 TIMESTAMP或一個當地時間的YYMMDD或YYYMMDD格式的數字。

 

例如:

SELECT UNIX_TIMESTAMP() ; (執行時的時間:2009-08-06 10:10:40)# 1249524739
SELECT UNIX_TIMESTAMP('2009-08-06') ;# 1249488000

from_unixtime()

from_unixtime(t1,』yyyy-MM-ddHH:mm:ss』) 

其中t1是10位的時間戳值,即1970-1-1至今的秒,而13位的所謂毫秒的是不可以的。 

對於13位時間戳,需要截取,然後轉換成bigint類型,因為from_unixtime類第一個參數只接受bigint類型。例如: 

select from_unixtime(cast(substring(tistmp,1,10) as bigint),』yyyy-MM-dd HH』) tim ,count(*) cn from ttengine_hour_data where …
SELECT from_unixtime(cast(ts AS bigint))FROM temptable


參考文章

https://wiki.jikexueyuan.com/project/mysql/useful-functions/time-functions.html

https://baike.baidu.com/item/unix%E6%97%B6%E9%97%B4%E6%88%B3

https://blog.csdn.net/qq_24309787/article/details/81095238

SQL系列文章持續更新中

                               

不知名數據分析師森夏恩

相關焦點

  • Myql SLEEP函數和SQL注入
    如果你是在Mysql慢查詢日誌中或者access日誌中看到,並且該跳請求返回的狀態碼為200,而不是404,那麼恭喜你可能中標了,被人Sql攻擊了。本文蟲蟲就和大家以sleep()函數為介入來討論。SLEEP()函數SLEEP(n),暫停資料庫n秒。
  • 當pandas撞上了sql,於是一個強大的pandasql庫產生了!
    下面這四張表大家應該不陌生,這就是網傳50道經典MySQL面試題中使用到的幾張原表。關於下方各表之間的關聯關係,我就不給大家說明了,仔細觀察欄位名,應該就可以發現。2. pandasql的使用1)簡介pandas中的DataFrame是一個二維表格,資料庫中的表也是一個二維表格,因此在pandas中使用sql語句就顯得水到渠成,pandasql使用SQLite作為其操作資料庫,同時Python自帶SQLite模塊,不需要安裝,便可直接使用。
  • Spark SQL重點知識總結
    (filename,org.apache.spark.sql.types.StringType,nullable = true))val schema=org.apache.spark.sql.types.StructType(filed)peopleRDD.map(_.split(",")).map(para=>org.apache.spark.sql.Row(para(0).trim,para
  • HiveSql基礎函數使用(三)
    前面兩篇文章介紹了一些常見且非常有用的函數,基本夠實現開發中的需求。本文主要介紹幾個select查詢函數的區別。從執行順序來說,兩者主要存在以下幾點區別 ① distinct只是將重複的行從結果中剔除出去;group by是按指定的列分組,一般這時在select中會用到聚合函數。 ②distinct是把不同的記錄顯示出來;group by是在查詢時先把紀錄按照類別分出來再查詢。
  • SQL*PLUS命令的使用大全(中)
    設置當前session是否對修改的數據進行自動提交   SQL>SET AUTO[COMMIT] {ON|OFF|IMM[EDIATE]| n}   2).在用start命令執行一個sql腳本時,是否顯示腳本中正在執行的SQL語句   SQL> SET ECHO {ON|OFF}   3).是否顯示當前sql語句查詢或修改的行數
  • 一場pandas與SQL的巔峰大戰(七)
    第五篇文章一場pandas與SQL的巔峰大戰(五)我們用多種方案實現了分組和不分組情況下累計百分比的計算。第六篇文章一場pandas與SQL的巔峰大戰(六)我們主要總結學習了SQL和pandas中計算日活和多日留存率的方法。
  • 開窗函數之累積和,PySpark,Pandas和SQL版實現
    之前寫過一篇PySpark之窗口函數實戰
  • 手撕SQL | 必知必會5道SQL面試題
    愛數據曉輝 | 作者愛數據學院8月SQL月考題 | 來源附本次sql>表列名含義如下:name:國家名稱continent :該國家屬於哪個洲area:⾯積population:⼈⼝gdp:國內⽣產總值請用sql
  • 美團開源 SQL 優化工具 SQLAdvisor,與內部版本保持一致
    上述實現時,涉及的函數為:mysql_sql_parse_join(TABLE_LIST join_table) mysql_sql_parse_join(Item join_condition) ,主要流程圖如下:
  • 一道簡單的sql語句題
    結果才發現,數據分析崗位大多注重的是資料庫的能力,比如sql語句的考察,hive的考察,以及一些運營思維的考察,所以第一次面試就很悲劇啦,不過題目還是很有代表性的。其他的不寫了,這裡只分享一個關於sql的題目。1、問題引出現在有兩個數據表,一個數據表記錄司機的信息,比如司機id,司機姓名,司機註冊時間等等,一個數據表記錄一天的訂單情況,比如訂單ID,訂單司機id,訂單時間。
  • 鞏固SQL - 窗口函數&變量&數據透視圖
    入數據行業近3年了,這3年的工作時間我絕大多數時間都在寫python
  • 15000 字的 SQL 語句大全
    組相關的信息:(統計信息) count,sum,max,min,avg  分組的標準)在SQLServer中分組時:不能以text,ntext,image類型的欄位作為分組依據在selecte統計函數中的欄位,不能和普通的欄位放在一起;
  • SQL on file 工具
    csvsql本質上不是獨立程序,而是個Python腳本,所以必須事先配置好Python環境,又因為許多功能依賴第三方,所以還要下載合適版本的函數庫。這些對程式設計師來說還算容易,但對數據分析師來說,就有點太為難了。csvsql的第二大缺點是沒有自己的計算引擎。
  • SQL是一門手藝
    實際上也有戲稱是標準查詢語言的,並不為過,SQL誕生於1974年,基於關係資料庫(也就是表格),發展至今毫無衰落跡象,反而滲透到各個數據處理工具/系統中:傳統資料庫、Hive數據倉庫、MongoDB支持類SQL,甚至玩dataframe表格的R語言也可以通過sqldf包寫sql,Spark、Flink也可以寫SQL,等等。玩數據分析,學好SQL無往而不利。
  • Flask Web 小項目——SQL 建表語句生成器
    在進行一番自我審查後,發現主要是構建建表語句時讓人感覺繁瑣,主要由以下幾方面導致:雖然都是 SQL,但在不同的存儲介質中的建表語法是不一樣;一般團隊裡有自己的語法規範,而這種規範會體現在每個細節中,操作多起來,犯錯的機會也會增加;建表時定義的欄位和注釋,還是得逐個核對修改,這一點是最耗時間的;為了提升工作效率,有必要將建表語句的構建流程給自動化
  • 如何利用Python實現SQL自動化?
    只要編寫好這個代碼,通過Python 連接到SQL 僅需:sql = Sql('database123')很簡單對麼?同時發生了幾件事,下面將對此代碼進行剖析。class Sql:首先要注意,這個代碼包含在一個類中。筆者發現這是合乎邏輯的,因為在此格式中,已經對此特定資料庫進行了增添或移除進程。若見其工作過程,思路便能更加清晰。
  • PandaSQL:一個讓你能夠通過SQL語句進行pandas的操作的python包
    為了開始使用PandaSQL,我們簡單地安裝它:pip install -U pandasql安裝了pandaSQL之後,我們可以通過創建pysqldf函數來使用它,該函數接受一個查詢作為輸入,並運行該查詢來返回一個Pandas DF。不用擔心語法,因為跟使用pandas差不多。
  • 如何用 SQL 的方式打開 Pandas?
    # 導入相關庫import numpy as npimport pandas as pdfrom pandasql import sqldf, load_meat, load_births基礎pandasql 中的主要函數是 sqldf,它接收兩個參數:一個SQL 查詢語句;一組會話/環境變量(locals() 或 globals
  • 經典SQL語句大全
    12、說明:日程安排提前五分鐘提醒SQL: select * from 日程安排 where datediff('minute',f開始時間,getdate())>513、說明:一條sql 語句搞定資料庫分頁select top 10 b.* from (select top 20 主鍵欄位,排序欄位 from 表名 order by 排序欄位
  • 新鮮出爐的SQL語句大全
    :不能以text,ntext,image類型的欄位作為分組依據在selecte統計函數中的欄位,不能和普通的欄位放在一起;select * from a leftinner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.dwhere 12、說明:日程安排提前五分鐘提醒