Domanda

Voglio limitare un rapporto per restituire i record dalla data A alla data B. Questo è quello che ho fatto:

declare @startDate varchar(20)
declare @endDate varchar(20)
set @startDate = '01/01/2008'
set @endDate = '04/01/2008'
-- test what are the start and end dates
select min(date),max(date) from view_Inspections 
where date between @startDate and @endDate

... che mi è stato detto di aver restituito i record dalle 12 am dal 1 gennaio alle 23:59 del 31 marzo (quella mezzanotte è l'impostazione predefinita quando non viene indicata l'ora). Ma ho notato una discrepanza, che è se un disco ha un tempo di 00:00:00 che farà parte di questo set.

Esiste un modo più esatto per farlo in modo che restituisca esattamente l'intervallo di date desiderato? *

Ho provato a usare il tempo:

declare @startDate varchar(20)
declare @endDate varchar(20)
set @startDate = '01/01/2008 00:00:00'
set @endDate = '04/01/2008 11:59:59'
-- test what are the start and end dates
select min(date),max(date) from view_Inspections 
where date between @startDate and @endDate

... ma ho notato qualcosa di instabile: SQL Server ROTORRÀ il centesimo di secondo in più della metà. Quindi ottengo quel record del 1 aprile (ah! Record del pesce d'aprile! Grr) se lo uso in qualsiasi momento dopo le 11:59:29. Perché?

  • (Sono sicuro che ci sia. Sono nuovo in questo. Grazie per il tuo aiuto!)
È stato utile?

Soluzione

C'è sempre l'opzione facile:

declare @startDate varchar(20)
declare @endDate varchar(20)
set @startDate = '01/01/2008'
set @endDate = '04/01/2008'

-- test what are the start and end dates
select min(date),max(date) from view_Inspections 
where date >= @startDate 
and   date < @endDate

Altri suggerimenti

Sospetto che la colonna della data in view_Inspections sia un tipo di dati SmallDateTime. Questo tipo di dati ha una precisione di 1 minuto, il che spiega i risultati imprevisti (arrotondando i secondi al minuto più vicino).

Il metodo suggerito da Roland Shaw è il modo migliore per modificare la query in base alle proprie esigenze.

L'operatore TRA è inclusivo, motivo per cui stai vedendo i risultati nella prima query. L'arrotondamento visualizzato nella seconda query dipenderà dall'esatto tipo di dati datetime che stai utilizzando nella tabella. (A proposito, penso che tu confonda i secondi con i centesimi di secondo). Sembra che tu stia probabilmente utilizzando un orario ridotto nel tuo tavolo, nel qual caso il tempo viene arrotondato al minuto più vicino.

Se la tua tabella utilizza datetime, prova a convertire esplicitamente i tuoi valori @startDate e @endDate in DATETIME (CAST (@endDate AS DATETIME))

Una breve nota ... anche per i valori DATETIME, SQL Server è preciso solo ai 1/100 di secondo, quindi 11: 59: 59.999 verrà arrotondato per eccesso a 12: 00: 00.000.

Fondamentalmente hai tre opzioni:

1) TRA CAST ('01 / 01/2008 00: 00: 00.000 'COME DATETIME) E CAST ('03 / 31/2008 12: 59: 59.997' COME DATETIME)

2) ANNO (my_date) = 2008 E MESE (my_date) TRA 1 E 3

3) my_date > = CAST ('01 / 01/2008 00: 00: 00.000 'COME DATETIME) E my_date < CAST ('04 / 01/2008 00: 00: 00.000 'COME DATETIME)

Il primo metodo non è molto intuitivo e secondo me è soggetto a errori. Il secondo metodo uccide le prestazioni poiché gli indici non possono essere utilizzati e diventa molto più complesso se si possono avere ricerche che durano anni o iniziano / finiscono a metà mese. Il terzo metodo, suggerito da Rowland, è il migliore che penso.

Prova semplicemente a rimuovere l'ora dal campo data in questo modo:

declare @startDate varchar(20)
declare @endDate varchar(20)
set @startDate = '01/01/2008'
set @endDate = '04/01/2008'

SELECT min(date),max(date) FROM view_Inspections 
WHERE CAST(FLOOR(CAST(date AS FLOAT)) AS DATETIME) BETWEEN CAST(@startDate AS DATETIME) And CAST(@startDate AS DATETIME))

Questo restituirà tutto da 01/01/2008 00:00:00 a 04/01/2008 11:59:59.999. Se non desideri includere 04/01, modifica la data di fine in 03/31/2008.

La tua soluzione migliore è semplicemente creare un campo BIGINT (10) che abbia chiamato " julian " e salvarlo in AAAAMMGG

Quindi esegui la query dove julian > = '20120103' E julian < = '20120203'

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top