4
votes

Pourquoi DATENAME (GETDATE ()) donne-t-il un résultat différent comme DATENAME (2019-02-01) alors que c'est la date d'aujourd'hui?

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)


1 commentaires

astuce, faites un SELECT 2019-02-01 et voyez ce qu'il renvoie


3 Réponses :


2
votes

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 >


0 commentaires

7
votes

2 raisons. Tout d'abord, vous utilisez la valeur 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>.

Si vous remplacez la valeur par une chaîne, car vous utilisez (probablement) toujours 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.

Pour obtenir le bon résultat, utilisez une chaîne littérale non ambiguë:

XXX

Les formats de date (heure) non ambigus (quel que soit le type de données) dans SQL Server sont 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];


1 commentaires

Merci pour l'explication claire! Cela me rendait fou :)



2
votes

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.])


1 commentaires

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 .