Υπάρχουν φορές που κάποιος θέλει να εμφανίζεται το λεκτικό του μήνα ή της ημέρας στην γλώσσα που επιθυμεί. Αυτό μπορεί να γίνει με κάποιους τρόπους και έχω δει και χρησιμοποιήσει πολλούς, αλλά θα μιλήσω μόνο για δύο στο άρθρο αυτό καθώς οι άλλοι προσδίδουν περισσότερη πολυπλοκότητα στο κώδικα που πρακτικά δεν αξίζει κάποιος να ασχοληθεί μαζί τους.
Note
Και οι δύο λύσεις ισχύουν τόσο σε SQL Server και Azure SQL Databases όσο και σε Azure Synapse SQL Pool
Using SET LANGUAGE
Η πρώτη λύση που μπορεί να χρησιμοποιήσει κάποιος, είναι να ορίζει την γλώσσα στο εκάστοτε session και να χρησιμοποιεί την DATENAME function που έχουμε στον SQL Server.
Για να ορίζει κάποιος την γλώσσα στο session θα πρέπει να εκτελέσει την
SET LANGUAGE όπου το όνομα της γλώσσας μπορεί να το βρει από τις γλώσσες που γνωρίζει ο SQL Server και μπορούμε να μάθουμε ποιες είναι αυτές κάνοντας query στο system view sys.syslanguages ή εκτελώντας την sp_helplanguage stored procedure.
SQL Script
SELECT * FROM sys.syslanguages;
EXEC sp_helplanguage;
Σε αυτή την λύση όμως έχουμε κάποια προβλήματα, πρέπει να κάνουμε κάποιες παραδοχές και το σημαντικότερο είναι ότι όσο το session είναι ενεργό ισχύει η επιλογή γλώσσας που έχουμε κάνει. Αυτά αφορούν το date format και το ποια θεωρείτε η πρώτη ημέρα της εβδομάδας σε κάθε γλώσσα. Επίσης ο ορισμός για κάποιες γλώσσες δεν είναι πάντα εύκολος πχ κινέζικα.
SQL Script
SET LANGUAGE us_english
SELECT orderdate
, DATENAME(MONTH,orderdate) as MonthName
, DATENAME(WEEKDAY,orderdate) as DayName
FROM Sales.Orders;
GO
SET LANGUAGE greek
SELECT orderdate
, DATENAME(MONTH,orderdate) as MonthName
, DATENAME(WEEKDAY,orderdate) as DayName
FROM Sales.Orders;
GO
SET LANGUAGE French
SELECT orderdate
, DATENAME(MONTH,orderdate) as MonthName
, DATENAME(WEEKDAY,orderdate) as DayName
FROM Sales.Orders;
GO
SET LANGUAGE 简体中文
SELECT orderdate
, DATENAME(MONTH,orderdate) as MonthName
, DATENAME(WEEKDAY,orderdate) as DayName
FROM Sales.Orders;
GO
Using FORMAT function
Αντί να μπαίνουμε σε τέτοιες διαδικασίες υπάρχει καλύτερος θεωρώ τρόπος και είναι διαθέσιμος από τον SQL Server 2012. Σε αυτόν απλά κάνουμε χρήση της FORMAT function.
Με αυτή δεν αλλάζουμε την συμπεριφορά στο session οπότε δεν έχουμε ούτε παραδοχές ούτε προβλήματα και μπορούμε ταυτόχρονα να έχουμε τα ονόματα σε περισσότερες από μια γλώσσες.
SQL Script
SELECT orderdate
, FORMAT( orderdate, 'MMMM', 'en-US' ) AS englishmonth
, FORMAT( orderdate, 'MMMM', 'el-GR' ) AS greekmonth
, FORMAT( orderdate, 'MMMM', 'it-IT' ) AS italicmonth
, FORMAT( orderdate, 'MMMM', 'es-ES' ) AS spainmonth
, FORMAT( orderdate, 'MMMM', 'zh-cn' ) AS chineesemonth
, FORMAT( orderdate, 'dddd', 'en-US' ) AS englishday
, FORMAT( orderdate, 'dddd', 'el-GR' ) AS greekday
, FORMAT( orderdate, 'dddd', 'it-IT' ) AS italicday
, FORMAT( orderdate, 'dddd', 'es-ES' ) AS spainday
, FORMAT( orderdate, 'dddd', 'zh-cn' ) AS chineeseday
FROM Sales.Orders;
GO
Query Result
orderdate |
englishmonth |
greekmonth |
italicmonth |
spainmonth |
chineesemonth |
englishday |
greekday |
italicday |
spainday |
chineeseday |
2017-07-04 |
July |
Ιούλιος |
luglio |
julio |
七月 |
Tuesday |
Τρίτη |
martedì |
martes |
星期二 |
2017-07-05 |
July |
Ιούλιος |
luglio |
julio |
七月 |
Wednesday |
Τετάρτη |
mercoledì |
miércoles |
星期三 |
2017-07-08 |
July |
Ιούλιος |
luglio |
julio |
七月 |
Saturday |
Σάββατο |
sabato |
sábado |
星期六 |
2017-07-08 |
July |
Ιούλιος |
luglio |
julio |
七月 |
Saturday |
Σάββατο |
sabato |
sábado |
星期六 |
2017-07-09 |
July |
Ιούλιος |
luglio |
julio |
七月 |
Sunday |
Κυριακή |
domenica |
domingo |
星期日 |
2017-07-10 |
July |
Ιούλιος |
luglio |
julio |
七月 |
Monday |
Δευτέρα |
lunedì |
lunes |
星期一 |
2017-07-11 |
July |
Ιούλιος |
luglio |
julio |
七月 |
Tuesday |
Τρίτη |
martedì |
martes |
星期二 |
2017-07-12 |
July |
Ιούλιος |
luglio |
julio |
七月 |
Wednesday |
Τετάρτη |
mercoledì |
miércoles |
星期三 |
2017-07-15 |
July |
Ιούλιος |
luglio |
julio |
七月 |
Saturday |
Σάββατο |
sabato |
sábado |
星期六 |
2017-07-16 |
July |
Ιούλιος |
luglio |
julio |
七月 |
Sunday |
Κυριακή |
domenica |
domingo |
星期日 |
2017-07-17 |
July |
Ιούλιος |
luglio |
julio |
七月 |
Monday |
Δευτέρα |
lunedì |
lunes |
星期一 |
2017-07-18 |
July |
Ιούλιος |
luglio |
julio |
七月 |
Tuesday |
Τρίτη |
martedì |
martes |
星期二 |
2017-07-19 |
July |
Ιούλιος |
luglio |
julio |
七月 |
Wednesday |
Τετάρτη |
mercoledì |
miércoles |
星期三 |
2017-07-19 |
July |
Ιούλιος |
luglio |
julio |
七月 |
Wednesday |
Τετάρτη |
mercoledì |
miércoles |
星期三 |
2017-07-22 |
July |
Ιούλιος |
luglio |
julio |
七月 |
Saturday |
Σάββατο |
sabato |
sábado |
星期六 |
2017-07-23 |
July |
Ιούλιος |
luglio |
julio |
七月 |
Sunday |
Κυριακή |
domenica |
domingo |
星期日 |
2017-07-24 |
July |
Ιούλιος |
luglio |
julio |
七月 |
Monday |
Δευτέρα |
lunedì |
lunes |
星期一 |
2017-07-25 |
July |
Ιούλιος |
luglio |
julio |
七月 |
Tuesday |
Τρίτη |
martedì |
martes |
星期二 |
2017-07-26 |
July |
Ιούλιος |
luglio |
julio |
七月 |
Wednesday |
Τετάρτη |
mercoledì |
miércoles |
星期三 |
2017-07-29 |
July |
Ιούλιος |
luglio |
julio |
七月 |
Saturday |
Σάββατο |
sabato |
sábado |
星期六 |
//Antonios Chatzipavlis