FILTRO DATE

di il
11 risposte

FILTRO DATE

Buongiorno,
sono nuovo nel forum e non so bene come funziona.
Inoltre premetto di essere totalmente alle prime armi con le estrazioni SQL, ho praticamente un livello scolastico.

Mi trovo in difficoltà con una condizione di selezione date.
Ho difficoltà nell'estrarre dei dati nella tabella _JobPlanningDetailProd.[End Date] as [Data Fine Produzione] in quanto alcuni dati al suo interno sono campi con la data '01/01/1753' la quale deve risultare nulla.

Ma al contempo nella condizione WHERE devo filtrare le date della _JobPlanningDetailProd.[End Date] come date > = del 01'/01/2019.
Chiedo gentilmente il vostro aiuto per riuscire ad estrarre anche le date "NULLE".

Grazie.
Matteo

Riporto di seguito l'estrazione che ho fatto.

select

_Job.[Job Posting Group] as [Tipo Commessa]
,_Job.[No_] as [N.Commessa]
,convert (float,_Job.[MQ_LAYOUT],1) as [Mq Commessa]

,_JobPlanningDetailProd.[Start Date] as [Data Inizio Produzione]
,_JobPlanningDetailProd.[End Date] as [Data Fine Produzione]

--,case convert(date,_JobPlanningDetailProd.[End Date])
-- when convert(date,'01/01/1753',103) then null
-- else _JobPlanningDetailProd.[End Date]
--end as [Data Fine Produzione]

,_JobPlanningDetailIns.[Start Date] as [Data Inizio Installazione]
,_JobPlanningDetailIns.[End Date] as [Data Fine Installazione]

--,_Job.[Data Messa in Funzione Effett_] as [Data Messa in Funzione Effettiva]


from [UNITEC_PROD].[dbo].[Unitec Prod$Job] _Job (NOLOCK)

left join [UNITEC_PROD].[dbo].[Unitec Prod$Job Planning Detail] _JobPlanningDetailProd (NOLOCK)
on _JobPlanningDetailProd.[Job No_] = _Job.[No_]


left join [UNITEC_PROD].[dbo].[Unitec Prod$Job Planning Detail] _JobPlanningDetailIns (NOLOCK)
on _JobPlanningDetailIns.[Job No_] = _Job.[No_]

where _Job.[No_] not like '0%'
and _Job.[Job Posting Group] in ('C/PROVA', 'COMODATO', 'VENDITA')
and _JobPlanningDetailProd.[Job Task Category] like 'PRD'
and _JobPlanningDetailIns.[Job Task Category] like 'INS'
and convert (date,_JobPlanningDetailProd.[End Date],103) >= convert (date,'01/01/2019',103)

11 Risposte

  • Re: FILTRO DATE

    Non si capisce se le date sono registrate come tipo stringa ( ... e nel caso non mi pare una buona idea);

    cmq, potresti usare la funzione NULLIF.

    Dovresti però valutare se nella where è meglio mettere una
    ... OR convert (date,_JobPlanningDetailProd.[End Date],103) = convert (date,','01/01/1753'',103)
    piuttosto che usare NULLIF

    HTH
  • Re: FILTRO DATE

    Intanto grazie sspintux per l'aiuto.

    Allora le date non dovrebbero essere stringhe e usando OR nella clausula Where mi tira fuori troppi record. Per cui non dovrebbe andar bene.
    La clausula NULLIF non la conosco.
    Qual è la sua sintassi?
    Dove la devo scrivere?
    Grazie
  • Re: FILTRO DATE

    ... e dai che una ricerca su google la puoi fare

    P.S.

    and ( convert (date,_JobPlanningDetailProd.[End Date],103) >= convert (date,'01/01/2019',103) OR .... )

    Se le date sono di tipo date o datetime non serve usare la convert sui campi delle tabelle
    ed anche per le date costanti puoi usare il formato YYYYMMDD , '20190101' senza convert
  • Re: FILTRO DATE

    Salve,
    @spintux ha ragione di chiedere SE JobPlanningDetailProd.[End Date] sia di tipo date o stringa, in quanto svariate volte nel codice si riscontra un cast a tipo date che, nel caso la colonna sia in effetti di tale tipo, ovviamente NON e' necessaria...
    quindi, come gia' @spintux, brutalmente scriverei
    
    DECLARE @DataNullValue date = '17530101';	-- al posto del MagicNumber usiamo questa "costante"
    DECLARE @minData date = '20190101';			-- parametro di data minima di ricerca
    
    
    SELECT 'value' AS [altri dati]
    
    	-- Il cast a tipo date sembrerebbe indicare che il tipo di [End Date] sia un varchar
    	-- ma se cosi' NON e', allora la conversione, come dice spintux, e' inutile
    	, CASE CONVERT(date,_JobPlanningDetailProd.[End Date])
    		WHEN CONVERT(date,'01/01/1753',103) THEN NULL
    		ELSE _JobPlanningDetailProd.[End Date]
    		END AS [Data Fine Produzione SBAGLIATO E RIDONDANTE]
    
    	-- cerchiamo di NON usare "MagicNumbers" sparsi per il codice:
    	-- conviene dichiarare una COSTANTE (che in T-SQL non esiste e quindi utilizziamo una variabile)
    	-- ed utilizzare questa in tutti i posti che serve, senza correre il rischio di errori di 
    	-- digitazione sparsi per il codice, ed inoltre cio' consente di modificare tale
    	-- valorizzazione 1 volta sola nel caso sia necessario, 
    	-- quindi, VEDI SOPRA la dichiarazione della variabile
    	, CASE  WHEN _JobPlanningDetailProd.[End Date] = @DataNullValue THEN NULL
    		ELSE _JobPlanningDetailProd.[End Date]
    		END AS [Data Fine Produzione]
    
    	FROM ---- altre tabelle, JOIN
    		dbo.[Unitec Prod$Job Planning Detail] AS _JobPlanningDetailProd
    
    	WHERE (1 = 1) -- sono le altre condizioni
    		-- filtro sulle date
    		AND ( _JobPlanningDetailProd.[End Date] >= @minData
    				OR _JobPlanningDetailProd.[End Date] = @DataNullValue
    			);
    
    salutoni romagnoli
    --
    Andrea
  • Re: FILTRO DATE

    Ciao @Andrea,
    sono curioso,
    e sembrerebbe che il NULLIF al posto del case non sia di tuo gradimento;
    ... c'è un qualche motivo ?
    
    CASE  WHEN _JobPlanningDetailProd.[End Date] = @DataNullValue THEN NULL
    		ELSE _JobPlanningDetailProd.[End Date]
    		END AS [Data Fine Produzione]
    
    --- alternativa equivalente :
    NULLIF(_JobPlanningDetailProd.[End Date], @DataNullValue)  AS [Data Fine Produzione]
    
  • Re: FILTRO DATE

    Salve Spintux,

    pura abitudine di 25 anni :D
    certi "costrutti" non riesco a farmeli piacere, mentre mi piaccio le "novita'" tipo tutte le windowing functions [ROW_NUMBER() OVER... ] e simili
    tutto li'
    e, per inciso, NULLIF va benissimo!!
    salutoni romagnoli
    --
    Andrea
  • Re: FILTRO DATE

    Salve Spintux,

    pura abitudine di 25 anni :D
    certi "costrutti" non riesco a farmeli piacere, mentre mi piaccio le "novita'" tipo tutte le windowing functions [ROW_NUMBER() OVER... ] e simili
    tutto li'
    e, per inciso, NULLIF va benissimo!!
    salutoni romagnoli
    --
    Andrea
  • Re: FILTRO DATE

    Salve Spintux,

    pura abitudine di 25 anni :D
    certi "costrutti" non riesco a farmeli piacere, mentre mi piaccio le "novita'" tipo tutte le windowing functions [ROW_NUMBER() OVER... ] e simili
    tutto li'
    e, per inciso, NULLIF va benissimo!! , tanto piu' che in questo caso il CASE e' costituito da una singola comparazione e non multipla
    salutoni romagnoli
    --
    Andrea
  • Re: FILTRO DATE

    asql ha scritto:


    Salve Spintux,
    ...
    certi "costrutti" non riesco a farmeli piacere
    ...
    De gustibus non est disputandum
  • Re: FILTRO DATE

    Salve ancora...
    ieri, al mare( ) ripensavo a quanto sopra... e in effetti probabilmente non sono stato completamente sincero
    a dire il vero, la funzione NULLIF e' una di quelle che ho usato pochissimo in vita mia, da contarsi sulla punta delle dita di 1 mano, e sicuramente per questo "non me ne ricordo" neanche e ti ringrazio per avermela riportata all'attenzione...
    il mio codice e' pieno di ISNULL(....), ma di NULLIF(...) sicuramente non c'e' traccia, in quanto difficilmente (e non mi ricordo un'evenienza) ho ad esempio dovuto verificare qualche cosa di simile a quanto indicato da @Lock87

    salutoni romagnoli
    --
    Andrea
  • Re: FILTRO DATE

    asql ha scritto:


    Salve ancora...
    ieri, al mare( ) ripensavo a quanto sopra... e in effetti probabilmente non sono stato completamente sincero
    Ciao Andrea,
    direi che con un'Ave Maria ed un Pater Nostrum puoi essere tranquillamente assolto

    Aggiungerei anche un centinaio di Atti di Dolore ... ma solo per l'invidia che tu sei al mare ed io no

    asql ha scritto:


    a dire il vero, la funzione NULLIF e' una di quelle che ho usato pochissimo in vita mia, da contarsi sulla punta delle dita di 1 mano, e sicuramente per questo "non me ne ricordo" neanche e ti ringrazio per avermela riportata all'attenzione...
    il mio codice e' pieno di ISNULL(....), ma di NULLIF(...) sicuramente non c'e' traccia
    Personalmente NULLIF mi è rimasta impressa perchè, avendo avuto modo di 'mettere mano' spesso e poco volentieri su codice altrui,
    ho notato che il NULL sembra essere visto come qualcosa di anomalo e di cui diffidare
    tanto da essere portati a sostuirlo con qualcosa di più familiare;

    per esempio lo zero per i tipi numerici
    ( e qualche mal testa può venire in caso di banali BUG come dimenticare l'assegnazione di un valore di ritorno da una funzione
    datosi che lo zero è anche il valore di default dei tipi numerici nei linguaggi di programmazione)

    o , forse come in questo caso, il NULL è stato sostituito da '01/01/1753' che , se ben ricordo, era
    il minimo valore assegnabile alle date nelle vetuste versioni di Sql Server.

    Suppongo, e questo caso sembrerebbe confermarlo, che il NULLIF sia nato proprio
    per questo tipo di scelta piuttosto comune di sostituire il NULL con qualcosa all'apparenza più rassicurante
    salvo poi accorgersi che in effetti il NULL (valore sconosciuto) non era in realtà tanto male per modellare il problema

    Salutoni ... con grande invidia per la nuotata
Devi accedere o registrarti per scrivere nel forum
11 risposte