2
votes

La fonction GAUCHE dans SQL Server ne renvoie aucun résultat

J'essaie de placer des données correspondant à un certain mois dans une table temporaire à partir d'une base de données SQL.

DROP TABLE
    #ComPAIR_Alliance_Table
SELECT
    IMOno
    ,period
    ,[service]
    ,alliances
INTO
    #ComPAIR_Alliance_Table
FROM
    com_COMPAIR.dbo.Data_BlueWaterCapacity_US_2
WHERE
    LEFT(period, 7) = '2015-03'

SELECT
     *
FROM #ComPAIR_Alliance_Table

Le champ période est au format suivant: 2015-03-29 00: 00: 00.000

Cependant, mon code retourne simplement une table temporaire vide avec les bons noms de colonne mais pas de lignes (même si je sais avec certitude que des lignes avec cette date existent dans ma table). Je me suis déjà assuré que la colonne période est bien une chaîne en utilisant is.numeric.

Quelqu'un pourrait-il m'aider s'il vous plaît avec quel pourrait être le problème?

Merci!


4 commentaires

Quel est le type de données de période ? Je parie que c'est une date .


La période est-elle une colonne de chaîne? ou une colonne date / heure? Notez que votre requête n'est pas SARGable.


J'ai également essayé d'utiliser YEAR (période) = 2019 ET MOIS (période) = 09 mais cela n'a pas fonctionné non plus


Vous ne vérifiez pas le type de données en utilisant ISNUMERIC. Vous regardez la structure de la table ou comme SELECT sql_variant_property (period, 'basetype')


5 Réponses :


-2
votes

la date est stockée sous forme de type de date. Vous pouvez essayer

where convert(varchar(20), period,121) 

qui le convertirait en chaîne ...


1 commentaires

Et empêcher toute utilisation d'un index? C'est une très mauvaise idée.



3
votes

S'il s'agit d'une date / datetime / datetime2, vous pouvez la comparer avec 2015-03 comme:

WHERE period >= '2015-03-01'
AND   preiod <  DATEADD(MONTH, 1, '2015-03-01')

En cas de confusion: p >

  • Ce qui précède correspondra à toutes les dates de mars 2015 telles que 31/03/2015 , 31/03/2015 23:59:59 et 03/03/2015 -31 23: 59: 59.9999999
  • Ce qui précède est discutable: la partie DATEADD ne dépend pas des lignes du tableau


1 commentaires

Et maintenant, cela a 2 votes contre? J'aimerais vraiment savoir pourquoi. Si quelqu'un a quelque chose à ajouter ici, partagez-le. :)



2
votes

La période est une date . Si c'est le cas, arrêtez de le traiter comme un varchar , ce n'en est pas un. Si vous voulez des valeurs de mars 2015, faites:

WHERE period >= '20150301'
  AND period < '20150401'


1 commentaires

Pourquoi cela a-t-il reçu un vote négatif? C'est la même solution que celles de Salman.A, qui ont toutes deux été publiées en même temps. Quelqu'un pourrait-il expliquer?




0
votes

La fonction LEFT a besoin de convertir implicitement votre colonne datetime en une valeur varchar pour faire son travail. SQL Server choisit le format varchar de la date en fonction de ses paramètres d'internationalisation. Sur mon serveur, son 29 mars 2015 à minuit et LEFT donne le 29 mars . C'est pourquoi il n'est pas égal à 2015-03 .

Vous devez traiter votre colonne comme une date-heure, puis effectuer la comparaison en utilisant une comparaison date-heure valide, comme ceci:

WHERE période ENTRE '1/1/2015' ET '1/31/2015'


1 commentaires

Bien que votre réponse puisse conduire à un résultat correct, elle dépend toujours des paramètres régionaux et dépend des paramètres de langue. Un tel format est une alternative plus sûre: WHERE période ENTRE '20150101' ET '20150131'