sql >> Databasteknik >  >> RDS >> Sqlserver

6 funktioner för att hämta dag, månad och år från ett datum i SQL Server

Transact-SQL innehåller ett gäng funktioner som hjälper oss att arbeta med datum och tider. En av de vanligaste uppgifterna när man arbetar med datum är att extrahera dejtens olika delar. Till exempel, ibland vill vi bara ha året, eller månaden. Andra gånger kanske vi vill ha veckodag. Hur som helst, det finns många sätt att göra detta i SQL Server.

I synnerhet låter följande funktioner dig returnera dag, månad och år från ett datum i SQL Server.

  • DAY() , MONTH() och YEAR()
  • DATEPART()
  • DATENAME()
  • FORMAT()

Dessa funktioner förklaras nedan.

Funktionerna DAY(), MONTH() och YEAR()

Det mest uppenbara sättet att returnera dag, månad och år från ett datum är att använda T-SQL-funktionerna med samma namn. Ja, T-SQL har funktioner byggda specifikt för att returnera dessa tre datumdelar.

Här är ett exempel på hur de fungerar:

DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042';
SELECT 
    DAY(@date) AS DAY,
    MONTH(@date) AS MONTH,
    YEAR(@date) AS YEAR;

Resultat:

+-------+---------+--------+
| DAY   | MONTH   | YEAR   |
|-------+---------+--------|
| 2     | 6       | 2018   |
+-------+---------+--------+

Dessa funktioner returnerar datumdelen som ett heltal. De returnerar samma resultat som DATEPART() funktion returnerar för den angivna datumdelen.

DATUMPART()-funktionen

DATEPART() funktion byggdes specifikt för att returnera specificerade delar av ett datum. Därför kan vi använda den här funktionen för att returnera exakt samma resultat som föregående exempel:

DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042';
SELECT 
    DATEPART(day, @date) AS DAY,
    DATEPART(weekday, @date) AS WEEKDAY,
    DATEPART(month, @date) AS MONTH,
    DATEPART(year, @date) AS YEAR;

Resultat:

+-------+-----------+---------+--------+
| DAY   | WEEKDAY   | MONTH   | YEAR   |
|-------+-----------+---------+--------|
| 2     | 7         | 6       | 2018   |
+-------+-----------+---------+--------+

En fördel med att använda den här funktionen är att du även kan returnera andra delar av datum och tid. Som du kan se med det här exemplet returnerade jag såväl veckodagen som dagen (day är dagen i månaden, weekday är veckodagen). Du kan också returnera de olika tidsdelarna, såsom minuter, sekunder, millisekunder, etc. För fler exempel, se DATEPART() Exempel i SQL Server.

DATEPART() funktion returnerar sitt resultat som ett heltal, och därför kommer du inte att kunna få månadsnamnet eller veckodagsnamnet från datumet. Men oroa dig inte, du kan använda DATENAME() eller FORMAT() funktioner för det.

DATUMNAMN()-funktionen

DATENAME() funktionen liknar DATEPART() funktion, förutom att den returnerar resultatet som en teckensträng istället för ett heltal. DATENAME() returnerar också månad och veckodag som deras fullständiga namn, snarare än deras numeriska värde.

Exempel:

DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042';
SELECT 
    DATENAME(day, @date) AS DAY,
    DATENAME(weekday, @date) AS WEEKDAY,
    DATENAME(month, @date) AS MONTH,
    DATENAME(year, @date) AS YEAR;

Resultat:

+-------+-----------+---------+--------+
| DAY   | WEEKDAY   | MONTH   | YEAR   |
|-------+-----------+---------+--------|
| 2     | Saturday  | June    | 2018   |
+-------+-----------+---------+--------+

För fler exempel på denna funktion, se DATENAME() Exempel i SQL Server.

FORMAT()-funktionen

Vi kan använda FORMAT() funktion för att returnera samma värden som med DATENAME() funktion och mer.

Detta är en mer mångsidig funktion än de tidigare. Det låter dig formatera datum/tid samt numeriska värden som strängar. Returvärdet är antingen nvarchar eller null (beroende på inmatningen), och längden på strängen bestäms av det angivna formatet.

FORMAT() ger också fler alternativ för hur datumdelen presenteras. Du kan ange om det ska visas som ett enda tecken, två tecken, tre, fyra och till och med fem i vissa fall.

Här är exempel att visa.

Dag

DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042';
SELECT 
    FORMAT(@date, 'd ') AS d,
    FORMAT(@date, 'dd') AS dd,
    FORMAT(@date, 'ddd') AS ddd,
    FORMAT(@date, 'dddd') AS dddd;

Resultat:

+-----+------+-------+----------+
| d   | dd   | ddd   | dddd     |
|-----+------+-------+----------|
| 2   | 02   | Sat   | Saturday |
+-----+------+-------+----------+

Månad

DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042';
SELECT 
    FORMAT(@date, 'M ') AS M,
    FORMAT(@date, 'MM') AS MM,
    FORMAT(@date, 'MMM') AS MMM,
    FORMAT(@date, 'MMMMM') AS MMMM;

Resultat:

+-----+------+-------+--------+
| M   | MM   | MMM   | MMMM   |
|-----+------+-------+--------|
| 6   | 06   | Jun   | June   |
+-----+------+-------+--------+

År

DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042';
SELECT     
    FORMAT(@date, 'y ') AS y,
    FORMAT(@date, 'yy') AS yy,
    FORMAT(@date, 'yyy') AS yyy,
    FORMAT(@date, 'yyyy') AS yyyy,
    FORMAT(@date, 'yyyyy') AS yyyyy;

Resultat:

+-----+------+-------+--------+---------+
| y   | yy   | yyy   | yyyy   | yyyyy   |
|-----+------+-------+--------+---------|
| 18  | 18   | 2018  | 2018   | 02018   |
+-----+------+-------+--------+---------+

Observera att vi har möjlighet att formatera årsdelen som fem siffror.

Om antalet siffror

När en datumdel returneras i siffror, bestämmer formatspecifikationen det minsta antalet siffror som ska returneras. Till exempel när du använder  yyy , kommer året att returneras som tre siffror om året är 0008 men som fyra siffror om året är 2008 .

Exempel:

DECLARE @date datetime2 = '0008-06-02 08:24:14.3112042';
SELECT     
    FORMAT(@date, 'y ') AS y,
    FORMAT(@date, 'yy') AS yy,
    FORMAT(@date, 'yyy') AS yyy,
    FORMAT(@date, 'yyyy') AS yyyy,
    FORMAT(@date, 'yyyyy') AS yyyyy;  

Resultat:

+-----+------+-------+--------+---------+
| y   | yy   | yyy   | yyyy   | yyyyy   |
|-----+------+-------+--------+---------|
| 8   | 08   | 008   | 0008   | 00008   |
+-----+------+-------+--------+---------+

Även när du använder det enskilda alternativet (t.ex. d ) som datumspecifikator måste du lägga till ett mellanslag om du bara vill att datumdelen ska returneras av sig själv. Om du inte gör det här får du mer än den enda dateparten.

Exempel:

DECLARE @date datetime2 = '2008-06-02 08:24:14.3112042';
SELECT 
    FORMAT(@date, 'd ') AS 'Space',
    FORMAT(@date, 'd') AS 'No Space',
    FORMAT(@date, 'M ') AS 'Space',
    FORMAT(@date, 'M') AS 'No Space',
    FORMAT(@date, 'y ') AS 'Space',
    FORMAT(@date, 'y') AS 'No Space';

Resultat:

+---------+------------+---------+------------+---------+------------+
| Space   | No Space   | Space   | No Space   | Space   | No Space   |
|---------+------------+---------+------------+---------+------------|
| 2       | 6/2/2008   | 6       | June 2     | 8       | June 2008  |
+---------+------------+---------+------------+---------+------------+

För mer FORMAT() exempel, se Hur man formaterar datum och tid i SQL Server.


  1. Hur REGEXP fungerar i MariaDB

  2. SQLite JSON_INSERT()

  3. IS NOT NULL-testet för en post returnerar inte TRUE när variabeln är inställd

  4. ODBC-fråga på MS SQL Server returnerar endast de första 255 tecknen i PHP PDO (FreeTDS)