Je ne comprends pas pourquoi DATENAME (GETDATE ()) donne un résultat différent de DATENAME (2019-02-01) Quand c'est la date d'aujourd'hui
2019-02-01 14:51:46.017 Friday Firday
Renvoie:
2019-02-01 14:51:46.017 Friday Monday<br>
Alors que je m'attendrais à ce qu'il retourne:
SELECT GETDATE(), DATENAME(w, GETDATE()),DATENAME(dw, 2019-02-01)
3 Réponses :
Veuillez utiliser cette date / heure
au format chaîne (format de date)
2019-02-01 14:01:38.343 Friday Friday
output
SELECT GETDATE(), DATENAME(w, GETDATE()),DATENAME(dw, '2019-02-01')
p >
2 raisons. Tout d'abord, vous utilisez la valeur Si vous remplacez la valeur par une chaîne, car vous utilisez (probablement) toujours Pour obtenir le bon résultat, utilisez une chaîne littérale non ambiguë: Les formats de date (heure) non ambigus (quel que soit le type de données) dans SQL Server sont 2019-02-01
; qui est l'expression "2019 moins 2 moins 1"; qui évalue à 2016
. 2016
en tant que date / heure
est la date '1905-07-10'
(qui est le 2,016e jour après '1900-01- 01 '
). Si vous obtenez la valeur de WEEKDAY
en utilisant la fonction DATENAME
de '1905-07-10'
, vous obtenez 'Monday' code>.
datetime
, la valeur '2019-02-01' code > serait interprété au format
aaaa-jj-MM
, ce qui signifie que vous obtenez la valeur 'Wednesday'
( SELECT DATENAME (WEEKDAY, CONVERT (datetime, '2019 -02-01 '));
), qui est le jour de la semaine du 02 janvier 2019. aaaaMMjj
et aaaa-MM-jjThh: mm: ss.ssss
(Le format aaaa-MM-jj
n'est pas ambigu si vous n'utilisez pas datetime
, notez que si vous exécutez le suivant SQL, la valeur de datetime
est différente :) SELECT CONVERT(date,'2019-02-01') AS [date],
CONVERT(datetime,'2019-02-01') AS [datetime],
CONVERT(datetime2(0),'2019-02-01') AS [datetime2],
CONVERT(datetimeoffset,'2019-02-01') AS [datetimeoffset];
Merci pour l'explication claire! Cela me rendait fou :)
DateTime doit être passé entre guillemets simples!
Vérifier:
DECLARE @date DATETIME = 2019-02-01 SELECT @date
Votre requête initiale (sans les guillemets) implique une "conversion implicite" où se trouve votre colonne de date en cours de conversion en varchar (en utilisant un format de serveur par défaut pour cette conversion [qui est traitée comme la date par défaut plus le nombre de jours égal au montant calculé de la valeur attribuée.])
La valeur 2019-02-01
n'est pas du tout convertie en varchar
. Ce sont 3 valeurs entières, dans une expression, qui sont évaluées puis implicitement converties en datetime
.
astuce, faites un
SELECT 2019-02-01
et voyez ce qu'il renvoie