Formattazione Data

mercoledì 23 gennaio 2008 - 13.41

ANNA79 Profilo | Junior Member

Ciao
ho problemi a formattare una data che ricavo da codice nel seguente formato gg/mm/aaaa
in quest'altro formato aaaa/mm/gg
Ho provato a fare così




select * from logSistema
where descrizione = 'Smart_Operator_Modificato'
and convert(varchar(10),datafine,121) < = convert(varchar(10), '12/11/2005',121)



faccio la convert nel formato 121 del campo datafine della tabella logSistema e del campo che gli passo io per fare il confronto.
Non mi ricava nessun dato ..ed è errato in quanto la tabella logSistema ha una datafine minore o uguale alla data che gli passo io.

uso SQL SERVER 2000

grazie
Anna

Wamba Profilo | Expert

>Ciao
Ciao

>ho problemi a formattare una data che ricavo da codice nel seguente
>formato gg/mm/aaaa
> in quest'altro formato aaaa/mm/gg
>Ho provato a fare così

>select * from logSistema
>where descrizione = 'Smart_Operator_Modificato'
>and convert(varchar(10),datafine,121) < = convert(varchar(10),
>'12/11/2005',121)

Ho fatto 2 prove ed ho scritto i risultati. Il tuo convert 121 scrive anche l'orario fino ai millisecondi.
Ho fatto le prove con un sql2005, ma dovrebbe reggere anche per SQL2000.

SET DATEFORMAT DMY /*Nota bene!*/
declare @Oggi as datetime
set @Oggi = getdate()
select CONVERT(varchar, @Oggi, 111) /*Scrive 2008/01/23*/
select CONVERT(varchar, @Oggi, 121) /*Scrive 2008/01/23 + Orario*/
select CONVERT(varchar(10),'12/11/2005',121) /*Scrive 12/11/2005*/

select 1
where (CONVERT(varchar, @Oggi, 111) < '2010/01/23') /*Funziona*/

select 1
where (@Oggi < CONVERT(datetime,'23/01/2010')) /*Meglio*/

Fammi sapere com'è andata.
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
blogs.ugidotnet.org/WamBlog/

ANNA79 Profilo | Junior Member

purtroppo a me il formato 111 mi scrive questo formato 2005/08/04 invece io dovrei avere il seguente formato 2005-08-04 e il codice 121 me lo da correttamente ma quando vado a fare la select controllando se la data è minore o uguale a quella del db non mi tira fuori nulla ed è strano perchè mi pare che il formato in cui lo metto è corretto


Query che non va:

select * from logSistema
where descrizione = 'Smart_Operator_Modificato' and
convert(varchar(10),datafine,121) <= convert(varchar, '16/01/2008',121)

nel db la data è impostata così
2008-01-16 yyyy-mm-dd
invece io dovrei formattare questo tipo di data dd/mm/yyyy nel formato del db per poter poi fare il confronto.



ho testato la convert con formato 121 sul campo della tabella e il risultato è corretto infatti mi porta la data nel formato che dico io:


select datafine , convert(varchar(10),datafine,121) from logSistema



CAMPO TABELLA
2005-08-04 15:46:36.420
2005-08-04 15:47:56.873
2005-08-04 15:48:45.873

CAMPO DOPO FORMATTAZIONE

2005-08-04
2005-08-04
2005-08-04




quindi non riesco a capire perchè la prima select non mi funziona

lbenaglia Profilo | Guru

>ho problemi a formattare una data che ricavo da codice nel seguente
>formato gg/mm/aaaa
> in quest'altro formato aaaa/mm/gg
>Ho provato a fare così
>
>select * from logSistema
>where descrizione = 'Smart_Operator_Modificato'
>and convert(varchar(10),datafine,121) < = convert(varchar(10),
>'12/11/2005',121)

Ciao Anna,

ti sconsiglio di applicare una funzione ad una colonna di una tabella che vai a specificare nella clausola WHERE, dato che verrebbe valutata per ogni riga della tabella.
Se provi a spiegarci quello che devi fare, postando un piccolo esempio con la struttura della tabella CREATE TABLE, alcune righe di prova INSERT INTO ed il result set finale che vuoi ottenere con quei dati, vedremo di darti una mano.

Inizio ad indicarti questo articolo di Tibor che spiega in modo ineccepibile come gestire le informazioni datetime in SQL Server:
http://www.karaszi.com/SQLServer/info_datetime.asp

>grazie
Prego.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

lbenaglia Profilo | Guru

>invece io dovrei formattare questo tipo di data dd/mm/yyyy nel
>formato del db per poter poi fare il confronto.
No.
Si usa SOLO il formato ANSI SQL 'YYYYMMDD' senza alcun separatore.
Posta un esempio come ti ho chiesto nel precedente post...

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

ANNA79 Profilo | Junior Member



CREATE TABLE LogSistema(id int (4) PRIMARY KEY NOT NULL,
procedura varchar(100),
descrizione varchar(512),
dataInizio datetime(8),
dataFine datetime(8),
FileName varchar(100),
esito decimal(9))




insert into logSistema
values('DTS','Smart_Operator_Modificato','20080116','20080116','SO_EstrazioneUtentiModificati
','1')


L'id viene inserito automaticamente in modo sequenziale.


allora io dovrei prendere dalla tabella logSistema tutti i record che hanno come descrizione 'SO_EstrazioneUtentiModificati' e la data fine < o uguale alla data che gli passo io da codice.
La data che gli passo io da codice è in questo formato dd/mm/yyyy
La data fine della mia tabella invece è in questo formato yyyymmdd


grazie di tutto
Anna

lbenaglia Profilo | Guru

>La data che gli passo io da codice è in questo formato dd/mm/yyyy
Da codice devi passare una data, NON una stringa formattata.
Con che linguaggio sviluppi?
Sia ADO e ADO.NET permettono tramite gli oggetti Command e SqlCommand di prevedere parametri di I/O tipizzati...

>La data fine della mia tabella invece è in questo formato yyyymmdd
No, la data nella tua tabella è in formato datetime, quindi internamente è costituita da una coppia di interi di 4 byte ciascuno (uno per la parte data e l'altro per la parte ora).

Osserva il seguente esempio:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Nell'esempio ho definito una stored procedure parametrica che accetta in input un parametro datetime.
Lato client non devi fare altro che valorizzare tale parametro con la data desiderata.
Se datafine contiene anche l'informazione oraria, dovrai modificare la clausola WHERE, calcolando la mezzanotte del giorno successivo a quello passato come argomento recuperando tutte le righe antecedenti a tale data:

AND dataFine < DATEADD(day, DATEDIFF(day, 0, @dataFine), 0) + 1;

>grazie di tutto
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

ANNA79 Profilo | Junior Member

Da codice devi passare una data, NON una stringa formattata.
Con che linguaggio sviluppi?
Sia ADO e ADO.NET permettono tramite gli oggetti Command e SqlCommand di prevedere parametri di I/O tipizzati...



purtroppo ho creato un DTS che prende dati dalla tabella e li scrive su un file di output.Per fare la gestione di tutti i dati ho dovuto sviluppare in vbscript..che non è che sia molto evoluto come linguaggio quindi ho dovuto spacchettare la data che mi arrivava e ricomporla con il formato di yyyymmdd perchè solo così la select che ti ho postato prima funziona....però volevo evitare di scrivere tutto quel codice e pensavo di abbreviare il tutto facendo direttamente la convert con la select...ma così non è stato

grazie di tutto comunque

lbenaglia Profilo | Guru

>purtroppo ho creato un DTS che prende dati dalla tabella e li
>scrive su un file di output.Per fare la gestione di tutti i dati
>ho dovuto sviluppare in vbscript..che non è che sia molto evoluto
>come linguaggio quindi ho dovuto spacchettare la data che mi
>arrivava e ricomporla con il formato di yyyymmdd perchè solo
>così la select che ti ho postato prima funziona...
Con VBScript puoi tranquillamente istanziare la classe ADODB.Command tramite CreateObject() e richiamare una stored procedure parametrica.

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Ora hai il tuo bel recordsert che puoi utilizzare come meglio credi.

>grazie di tutto comunque
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

ANNA79 Profilo | Junior Member

grazie ho risolto alla grande:)
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5