32 messaggi dal 13 agosto 2017
L'esempio era solo per farti capire...
32 messaggi dal 13 agosto 2017
andrea.tosato86 ha scritto:
MarkRoss ha scritto:
Scusami ma l'esempio è chiarissimo....Il signor Rossi dal 20.03.2017 al 25.03.2017 ha preso 6 giorni di ferie...procedo nel fare una ricerca dal 01.01.2017 al 22.03.2017 (e non 25.03.2017) il conteggio deve restituirmi n° 3 giorni! Non riesco a capire cosa non ti è chiaro....
Modificato da MarkRoss il 13 agosto 2017 22.26 -

Questo ultimo esempio è diverso dal precedente.
Qui hai 3 variabili in gioco.
1) data dal
2) data al
3) filtro.

L'operatore datediff non è sufficiente.
Devi calcolare la data minima tra il 22/3 e 25/3!


Come calcolo la data minima?
66 messaggi dal 09 febbraio 2005
Ciao,
neanche a me è chiaro come siano memorizzati i dati nel db;
ti è stato suggerito un sito dove puoi inserire le create table e le insert into
che puoi usare per rendere esplicito il tuo problema al di là di ogni ragionevole dubbio
... perché non usarlo ?
244 messaggi dal 22 gennaio 2017
Contributi
Penso di aver capito la problematica.
La risoluzione, con degli esempi la riporto qui:
http://sqlfiddle.com/#!6/dd22b/7
Cambiando i filtri di ricerca penso di aver soddisfatto le tue richieste. Esempio: http://sqlfiddle.com/#!6/dd22b/8
32 messaggi dal 13 agosto 2017
andrea.tosato86 ha scritto:
Penso di aver capito la problematica.
La risoluzione, con degli esempi la riporto qui:
http://sqlfiddle.com/#!6/dd22b/7
Cambiando i filtri di ricerca penso di aver soddisfatto le tue richieste. Esempio: http://sqlfiddle.com/#!6/dd22b/8


Ok si adesso hai inquadrato bene il problema....però c'è un errore! Ho provato a fare lo schema come suggerito (non l'ho mai usato) ma il totale giorni mi risulta 2 e non 1! http://sqlfiddle.com/#!6/a298f/3/0
E poi un'ultima cosa devo "convertire" quel codice T-SQL in vb.net...
Modificato da MarkRoss il 14 agosto 2017 16.04 -
Modificato da MarkRoss il 14 agosto 2017 16.05 -
244 messaggi dal 22 gennaio 2017
Contributi
Ciao,
Per il totale dei giorni, come già avevi fatto, puoi mettere un +1. Questo perchè hai bisogno di considerare gli estremi. La modifica puoi farla sulla query.

Per richiamare il codice via SQL invece ci sono 2 alternative per questo caso:
1) inserisci il codice in una stored procedure con i 3 parametri in ingresso: Dal, Al, CF
2) inserisci il codice in una Table-function che è molto simile alla stored procedure ma ti consente di riutilizzare la query all'interno di altri JOIN o sintassi SQL. In aggiunta ai 3 parametri in ingresso: Dal, Al, CF

Richiamare una stored procedure, ho preso un esempio con DataSet:
'Setup SQL Command
Dim CMD as new sqlCommand("StoredProcedureName")
CMD.parameters("@Parameter1", sqlDBType.Int).value = Param_1_value

Dim connection As New SqlConnection(connectionString)
CMD.Connection = connection
CMD.CommandType = CommandType.StoredProcedure

Dim adapter As New SqlDataAdapter(CMD)
adapter.SelectCommand.CommandTimeout = 300

'Fill the dataset
Dim DS as DataSet    
adapter.Fill(ds)
connection.Close()   

'Now, read through your data:
For Each DR as DataRow in DS.Tables(0).rows
    Msgbox("The value in Column ""ColumnName1"": " & cstr(DR("ColumnName1")))
next


In aggiunta, ti faccio notare che il codice SQL funziona da SQL 2012 in poi.
La sintassi IIF è uno sugar della sintassi più prolissa CASE.
Ti lascio un esempio per la conversione, nel caso tu avessi un SQL Server < 2012.
CASE WHEN <Condition> 
 THEN <true part> 
 ELSE <false part>
END

Modificato da andrea.tosato86 il 14 agosto 2017 16.40 -
32 messaggi dal 13 agosto 2017
andrea.tosato86 ha scritto:
Ciao,
Per il totale dei giorni, come già avevi fatto, puoi mettere un +1. Questo perchè hai bisogno di considerare gli estremi. La modifica puoi farla sulla query.

Per richiamare il codice via SQL invece ci sono 2 alternative per questo caso:
1) inserisci il codice in una stored procedure con i 3 parametri in ingresso: Dal, Al, CF
2) inserisci il codice in una Table-function che è molto simile alla stored procedure ma ti consente di riutilizzare la query all'interno di altri JOIN o sintassi SQL.

Richiamare una stored procedure, ho preso un esempio con DataSet:
'Setup SQL Command
Dim CMD as new sqlCommand("StoredProcedureName")
CMD.parameters("@Parameter1", sqlDBType.Int).value = Param_1_value

Dim connection As New SqlConnection(connectionString)
CMD.Connection = connection
CMD.CommandType = CommandType.StoredProcedure

Dim adapter As New SqlDataAdapter(CMD)
adapter.SelectCommand.CommandTimeout = 300

'Fill the dataset
Dim DS as DataSet    
adapter.Fill(ds)
connection.Close()   

'Now, read through your data:
For Each DR as DataRow in DS.Tables(0).rows
    Msgbox("The value in Column ""ColumnName1"": " & cstr(DR("ColumnName1")))
next


No Andrea non funziona!! Il codice sono riuscito a "convertirlo così" ed è ok:

 Dim a As Date = Date.Parse(TextBox2.Text)
        Dim b As Date = Date.Parse(TextBox3.Text)
        Dim source2 As String = WebConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
        Dim sql2 As String = "SELECT IIF(Dal > @Dal, Dal, @Dal) as FinestraRicercaDal, IIF(Al < @Al, Al, @Al) as FinestraRicercaAl,Dal, Al,DATEDIFF(day, IIF(Dal > @Dal, Dal, @Dal), IIF(Al < @Al, Al, @Al)) as Total FROM Tab1 WHERE Dal BETWEEN @Dal AND @Al OR Al BETWEEN @Dal AND @Al"
        Dim conn2 As New SqlConnection(source2)
        conn2.Open()
        Dim cmd2 As New SqlCommand(sql2, conn2)
        cmd2.Parameters.AddWithValue("@Codfisc", Me.GridView1.SelectedRow.Cells(8).Text)
        cmd2.Parameters.AddWithValue("@Dal", a)
        cmd2.Parameters.AddWithValue("@Al", b)
        Dim dr2 As SqlDataReader
        dr2 = cmd2.ExecuteReader()
        While dr2.Read()
           
            TextBox4.Text = dr2("Total") + 1.ToString()

            If IsDBNull(dr2("Total")) Then
                TextBox4.Text = "0"
            End If


        End While

        conn2.Close()


Non riesco a creare con SQL Fiddle il link prova tu inserendo questo codice:

CREATE TABLE [dbo].[Esempio](
  [Id] [int] NOT NULL,
  [CodiceFiscale] [nvarchar](50) NULL,
  [Dal] [datetime] NULL,
  [Al] [datetime] NULL,
 CONSTRAINT [PK_Esempio] PRIMARY KEY CLUSTERED 
(
  [Id] ASC
))
GO

INSERT INTO Esempio(Id, CodiceFiscale, Dal, Al)
VALUES
(1, 'ITCCCCC', '2017-02-01T00:00:00', '2017-02-13T00:00:00')
(2, 'ITCCCCC', '2017-02-01T00:00:00', '2017-02-13T00:00:00')


DECLARE @RicercaDal AS DATETIME, @RicercaAl  AS DATETIME
SET @RicercaDal = '2017-01-01'
SET @RicercaAl = '2017-04-10'

/*
SELECT Al FineFerie, @Al Ricerca, IIF(Al < @Al, Al, @Al)
FROM Esempio
WHERE Dal BETWEEN @Dal AND @Al 
OR Al BETWEEN @Dal AND @Al
*/

SELECT IIF(Dal > @RicercaDal, Dal, @RicercaDal) FinestraRicercaDal, 
IIF(Al < @RicercaAl, Al, @RicercaAl) FinestraRicercaAl,
Dal, Al,
DATEDIFF(day, IIF(Dal > @RicercaDal, Dal, @RicercaDal), IIF(Al < @RicercaAl, Al, @RicercaAl)) DIFFERENZA 
FROM Esempio
WHERE Dal BETWEEN @RicercaDal AND @RicercaAl 
OR Al BETWEEN @RicercaDal AND @RicercaAl


Il totale mi da 12 non va bene!! Non fa la somma dei giorni...
Modificato da MarkRoss il 14 agosto 2017 16.43 -
244 messaggi dal 22 gennaio 2017
Contributi
DECLARE @RicercaDal AS DATETIME, @RicercaAl  AS DATETIME
SET @RicercaDal = '2017-01-01'
SET @RicercaAl = '2017-04-10'

SELECT IIF(Dal > @RicercaDal, Dal, @RicercaDal) FinestraRicercaDal, 
IIF(Al < @RicercaAl, Al, @RicercaAl) FinestraRicercaAl,
Dal, Al,
DATEDIFF(day, IIF(Dal > @RicercaDal, Dal, @RicercaDal), IIF(Al < @RicercaAl, Al, @RicercaAl)) + 1 DIFFERENZA 
FROM Esempio
WHERE Dal BETWEEN @RicercaDal AND @RicercaAl 
OR Al BETWEEN @RicercaDal AND @RicercaAl


Questa non va bene?

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.