Du kan bruge ODBC-skalarfunktioner, når du kører T-SQL-sætninger i SQL Server. Der er forskellige typer ODBC-skalarfunktioner, herunder strengfunktioner, numeriske funktioner, systemfunktioner og selvfølgelig dato/tidsfunktioner (også kaldet dato-, klokkeslæts- og intervalfunktioner).
Nedenfor er eksempler på de dato-, tids- og intervalfunktioner, du kan bruge i SQL Server.
Syntaks
For det første, her er den syntaks, du skal bruge, når du kalder en ODBC-skalarfunktion:
VÆLG {fn[( ,....n) ] }
Hvor (
er et hvilket som helst antal valgfrie argumenter.
Så den vigtigste ting at huske er, at når du kalder en ODBC-skalarfunktion, skal du omslutte funktionskaldet inden for krøllede parenteser ({}
) og præfiks navnet med fn
.
Eksempel 1 – NU()
Denne funktion returnerer aktuel dato og klokkeslæt som en tidsstempelværdi.
VÆLG {fn NOW()} SOM Resultat;
Resultat:
+------------------------+| Resultat ||------------------------|| 2018-06-13 21:52:25.667 |+------------------------+
Eksempel 2 – Tidsstempel, dato og klokkeslæt
CURRENT_TIMESTAMP()
funktion returnerer den aktuelle lokale dato og lokal tid som en tidsstempelværdi. Du kan også bruge CURRENT_DATE()
for kun at returnere datodelen og/eller CURRENT_TIME()
for kun at returnere tidsdelen.
VÆLG {fn CURRENT_TIMESTAMP()} SOM 'Dato og tid', {fn CURRENT_DATE()} SOM 'Dato', {fn CURRENT_TIME()} SOM 'Tid';
Resultat:
+------------------------+-------+------ -------+| Dato og tid | Dato | Tid ||------------------------+------------+-------- ------|| 2018-06-13 21:57:29.197 | 2018-06-13 | 21:57:29.197 |+-------------------------+-----------+---- ----------+
Også CURRENT_TIMESTAMP()
og CURRENT_TIME()
begge accepterer et valgfrit argument for at bestemme sekunders præcision af den returnerede værdi.
Eksempler:
VÆLG {fn CURRENT_TIMESTAMP(3)} SOM 'Dato og tid', {fn CURRENT_TIME(6)} SOM 'Tid';
Resultat:
+------------------------+-----------------+| Dato og tid | Tid ||------------------------+----------------|| 2018-06-13 22:00:59.263 | 22:00:59.263000 |+------------------------+---------------- +
I dette eksempel, CURRENT_TIMESTAMP()
returnerer en sekunders præcision på 3, mens CURRENT_TIME()
returnerer en sekunders præcision på 6.
Eksempel 3 – CURDATE() og CURTIME()
Du kan bruge CURDATE()
og/eller CURTIME()
som et alternativ til ovenstående dato- og tidsfunktioner:
VÆLG {fn CURDATE()} SOM 'Dato', {fn CURTIME()} SOM 'Tid';
Resultat:
+------------+--------------+| Dato | Tid ||------------+-------------|| 2018-06-13 | 22:05:20.013 |+------------+-------------+
Bemærk, at disse argumenter ikke accepterer nogen argumenter, så hvis du har brug for at angive sekunders præcision, skal du bruge CURRENT_DATE()
og/eller CURRENT_TIME()
i stedet.
Eksempel 4 – dage og uger
Der er en masse ODBC-skalarfunktioner til at returnere specifikke dele af en datoværdi. Disse funktioner accepterer et argument, som er datoudtrykket at udtrække den ønskede datodel fra.
Her er de forskellige funktioner til at returnere dagene og ugerne fra datoen:
DECLARE @date datetime2 ='2000-02-14 07:31:58.1234567';VÆLG {fn DAYNAME(@date)} SOM 'DAYNAME', {fn DAYOFYEAR(@date)} SOM 'DAYOFYEAR', {fn DAYOFMONTH(@date)} SOM 'DAYOFMONTH', {fn DAYOFWEEK(@date)} SOM 'DAYOFWEEK', {fn WEEK(@date)} SOM 'WEEK';
Resultat:
+-------+------------------+----- --------+--------+| DAYNAME | DAGÅR | DAG I MÅNED | UGEDAG | UGE ||---------------------------------------- -------+--------|| mandag | 45 | 14 | 2 | 8 |+------------+-------------------------- -------+--------+
I dette tilfælde tildelte vi en dato til en variabel, og sendte derefter denne variabel til hver funktion. Funktionen returnerede derefter den relevante datodel.
Eksempel 5 – Måneder, kvartaler og år
Her er de forskellige funktioner til at returnere måneder, kvartaler og år fra dato/tidsværdien:
DECLARE @date datetime2 ='2000-02-14 07:31:58.1234567';VÆLG {fn YEAR(@date)} SOM 'YEAR', {fn MONTH(@date)} SOM 'MONTH', {fn MONTHNAME(@date)} SOM 'MONTHNAME', {fn QUARTER(@date)} SOM 'QUARTER';
Resultat:
+--------+---------+-------------+-----------+| ÅR | MÅNED | MÅNEDSNAVN | KVARTAL ||--------+---------+----------------|| 2000 | 2 | februar | 1 |+--------+---------+-------------+-----------+Eksempel 6 – Timer, minutter og sekunder
Her er de forskellige funktioner til at returnere timer, minutter og sekunder fra dato/tidsværdien:
DECLARE @date datetime2 ='2000-02-14 07:31:58.1234567';VÆLG {fn HOUR(@date)} SOM 'HOUR', {fn MINUTE(@date)} SOM 'MINUTE', {fn SECOND(@date)} SOM 'SECOND';Resultat:
+--------+----------+----------+| TIME | MINUTE | ANDEN ||--------+----------+--------|| 7 | 31 | 58 |+--------+-----------+----------+Eksempel 7 – EXTRACT()-funktionen
Der er også en ODBC-skalarfunktion kaldet
EXTRACT()
, som giver dig mulighed for at udtrække de forskellige datodele fra dato/tidsværdien. Eksempler nedenfor.År, måned og dag
DECLARE @date datetime2 ='2000-02-14 07:31:58.1234567';VÆLG {fn EXTRACT(YEAR FROM @date)} SOM 'YEAR', {fn EXTRACT(MONTH FROM @date)} SOM 'MONTH ', {fn EXTRACT(DAY FROM @date)} SOM 'DAY';Resultat:
+--------+---------+------+| ÅR | MÅNED | DAG ||--------+---------+-------|| 2000 | 2 | 14 |+--------+---------+------+Timer, minutter og sekunder
DECLARE @date datetime2 ='2000-02-14 07:31:58.1234567';VÆLG {fn EXTRACT(HOUR FROM @date)} SOM 'HOUR', {fn EXTRACT(MINUTE FROM @date)} SOM 'MINUTE ', {fn EXTRACT(SECOND FROM @date)} SOM 'SECOND';Resultat:
+--------+----------+----------+| TIME | MINUTE | ANDEN ||--------+----------+--------|| 7 | 31 | 58 |+--------+-----------+----------+Eksempel 8 – Funktionen TIMESTAMPADD()
TIMESTAMPADD()
giver dig mulighed for at tilføje et specificeret antal af det angivne interval (dato/tidsdel) til dato/tidsværdien. Denne funktion accepterer tre argumenter; intervallet (dato/tidsdel), der skal tilføjes (f.eks. måned), antallet af den del, der skal tilføjes, og datoværdien. Eksempler nedenfor.År, Kvartal, Måned og Dag
DECLARE @date datetime2 ='2000-02-14 07:31:58.1234567';VÆLG {fn TIMESTAMPADD(SQL_TSI_YEAR, 21, @date)} SOM 'SQL_TSI_YEAR', {fn TIMESTAMPADTSI_1QR. } SOM 'SQL_TSI_QUARTER', {fn TIMESTAMPADD(SQL_TSI_MONTH, 21, @date)} AS 'SQL_TSI_MONTH', {fn TIMESTAMPADD(SQL_TSI_DAY, 21, @date)} SOM 'SQL_TSI_DAY';Resultat:
SQL_TSI_YEAR | 2021-02-14 07:31:58.1234567SQL_TSI_QUARTER | 2005-05-14 07:31:58.1234567SQL_TSI_MONTH | 2001-11-14 07:31:58.1234567SQL_TSI_DAY | 2000-03-06 07:31:58.1234567Timer, minutter og sekunder
DECLARE @date datetime2 ='2000-02-14 07:31:58.1234567';VÆLG {fn TIMESTAMPADD(SQL_TSI_HOUR, 5, @date)} SOM 'SQL_TSI_HOUR', {fn TIMESTAMPADDSI_MINUTLED,SQL_TSI_HOUR, } SOM 'SQL_TSI_MINUTE', {fn TIMESTAMPADD(SQL_TSI_SECOND, 5, @date)} SOM 'SQL_TSI_SECOND', {fn TIMESTAMPADD(SQL_TSI_FRAC_SECOND, 5, @date)} SOM 'SQACL_SECOND_';Resultat:
SQL_TSI_HOUR | 2000-02-14 12:31:58.1234567SQL_TSI_MINUTE | 2000-02-14 07:36:58.1234567SQL_TSI_SECOND | 2000-02-14 07:32:03.1234567SQL_TSI_FRAC_SECOND | 2000-02-14 07:31:58.1284567Eksempel 9 – Funktionen TIMESTAMPDIFF()
TIMESTAMPDIFF()
funktion returnerer forskellen mellem to dato/tidsværdier. Denne funktion accepterer tre argumenter; intervallet (dato/tidsdel), som forskellen skal beregnes for (f.eks. måned), den første dato og den anden dato. Funktionen returnerer antallet af intervaller, som den første dato er større end den anden dato Eksempler nedenfor.År, Kvartal, Måned, Uge og Dag
DECLARE @date1 datetime2 ='2000-02-14 07:31:58.1234567'; DECLARE @date2 datetime2 =DATEADD(year, 1, @date1);VÆLG {fn TIMESTAMPDIFF(SQL_TSI_YEAR, @date1, @date2)} SOM 'SQL_TSI_YEAR', {fn TIMESTAMPDIFF(SQL_TSI_QUARTER, @date1, '_SQR2)} ', {fn TIMESTAMPDIFF(SQL_TSI_MONTH, @date1, @date2)} SOM 'SQL_TSI_MONTH', {fn TIMESTAMPDIFF(SQL_TSI_WEEK, @date1, @date2)} AS 'SQL_TSI_WEEK', @fn TIMESTAMPDIFF, @dato_TSI_WEEK(SQL_TSI_WEEK', @fn TIMESTAMPDIFF, @dato_dato,2dato) } SOM 'SQL_TSI_DAY';Resultat:
+----------------+------------------------+-------- --------+----------------+---------------+| SQL_TSI_YEAR | SQL_TSI_QUARTER | SQL_TSI_MONTH | SQL_TSI_WEEK | SQL_TSI_DAY ||----------------+------------------------+---------------- -------+----------------+--------------|| 1 | 4 | 12 | 52 | 366 |+----------------+--------------------+---------------- -------+----------------+---------------+Timer, minutter og sekunder
DECLARE @date1 datetime2 ='2000-02-14 07:31:58.1234567'; DECLARE @date2 datetime2 =DATEADD(dag, 1, @date1);VÆLG {fn TIMESTAMPDIFF(SQL_TSI_HOUR, @date1, @date2)} SOM 'SQL_TSI_HOUR', {fn TIMESTAMPDIFF(SQL_TSI_MINUTE, @date1, 'SQL_UT2)} ', {fn TIMESTAMPDIFF(SQL_TSI_SECOND, @date1, @date2)} AS 'SQL_TSI_SECOND', {fn TIMESTAMPDIFF(SQL_TSI_FRAC_SECOND, @date1, @date2)} AS 'SQL_TSI_FRAC_SECOND';Resultat:
+----------------+------------------------+---------------- -------------------------------------+| SQL_TSI_HOUR | SQL_TSI_MINUTE | SQL_TSI_SECOND | SQL_TSI_FRAC_SECOND ||----------------+------------------+---------------- -------+-----------------------------|| 24 | 1440 | 86400 | 86400000 |+----------------+------------------------+---------------- -------+------------------------------+