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!
5 Réponses :
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 ...
Et empêcher toute utilisation d'un index? C'est une très mauvaise idée.
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 >
31/03/2015 , 31/03/2015 23:59:59 et 03/03/2015 -31 23: 59: 59.9999999 DATEADD ne dépend pas des lignes du tableau Et maintenant, cela a 2 votes contre? J'aimerais vraiment savoir pourquoi. Si quelqu'un a quelque chose à ajouter ici, partagez-le. :)
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'
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?
LEFT fait des trucs bizarres, car LEFT provoque un cast implicite en String from Date . Vous pouvez voir cette question < / a> pour plus d'informations, mais vous obtenez exactement ce que vous avez dit à SQL d'obtenir - une jointure sur les lignes où les 7 caractères de gauche de la période sont égaux à '2015-03', ce qui ne se produira pas, car vous aimez comparer avec quelque chose comme 'Jan 01'
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'
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'
Quel est le type de données de
période? Je parie que c'est unedate.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')