88 messaggi dal 19 ottobre 2012
Buongiorno a tutti. Ho un problema discretamente complesso e spero possiate aiutarmi.
Ho una query che deve essere eseguita tutti i mesi tramite un job (ad esempio il 4 di ogni mese) e vorrei che in automatico inserisse nella query dove ho le 2 date

and tabella.campo between '20160201' and '20160229'


il primo e ultimo giorno del mese precedente e poi eseguire lo script.
Ad esempio il 4 di aprile lo script deve essere eseguito con

and tabella.campo between '20160301' and '20160331'


Vorrei evitare di scrivere 12 script (e poi l'anno prossimo di nuovo)

Grazie a tutti

Giorgio
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Giorgio,
la classe DateTime ha dei metodi che ti permettono di aggiungere/sottrarre giorni e mesi, quindi puoi sfruttarle per calcolarti le due date nel mese precedente.

In questo modo vado a calcolarmi l'ultimo del mese scorso, semplicemente sottraendo alla data odierna il numero di giorni trascorsi dall'inizio del mese.
(es. se siamo al giorno 10 sottrarrò 10 giorni).
var ultimoDelMesePrecedente = DateTime.Today.AddDays(-DateTime.Today.Day);

Se ne sottraggo uno un meno arrivo invece al primo del mese attuale. Sottraendo un ulteriore mese, arrivo al primo del mese precedente.
var primoDelMesePrecedente = DateTime.Today.AddDays(1-DateTime.Today.Day).AddMonths(-1);


Poi si tratta semplicemente di formattare le due date ottenute nel formato voluto. Qui trovi l'esempio:
https://dotnetfiddle.net/qqeo0P

ciao,
Moreno
Modificato da BrightSoul il 10 marzo 2016 23.22 -

Enjoy learning and just keep making
88 messaggi dal 19 ottobre 2012
Ciao Moreno Grazie. Ora provo il tutto e ti dico

Giorgio
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
non ho ben capito se il problema e' relativo a SQL Server o esterno ad esso, come nel caso risolto da Moreno...
nel caso di problematica prettamente SQL, si puo' tranquillamente risolvere con qualche operazione matematica sulle date...
trivialmente,
SET NOCOUNT ON;
DECLARE @Date date = '2016-03-04';


SELECT CONVERT(date, DATEADD(MONTH, -1, DATEADD(s, 1, DATEADD(mm, DATEDIFF(m, 0, @Date), 0)))) AS [Primo Giorno Mese Scorso],
  CONVERT(date, DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, @Date), 0))) AS [Ultimo Giorno Mese Scorso];
--<---------
Primo Giorno Mese Scorso Ultimo Giorno Mese Scorso
------------------------ -------------------------
2016-02-01               2016-02-29


e quindi puoi usare le tue espressioni di ricerca similarmente a

SET NOCOUNT ON;
DECLARE @Date date = '2016-03-04';


SELECT CONVERT(date, DATEADD(MONTH, -1, DATEADD(s, 1, DATEADD(mm, DATEDIFF(m, 0, @Date), 0)))) AS [Primo Giorno Mese Scorso],
  CONVERT(date, DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, @Date), 0))) AS [Ultimo Giorno Mese Scorso];

DECLARE @t TABLE (ColonnaData date);
INSERT INTO @t
  VALUES ('2016-01-01'), ('2016-02-01'), ('2016-02-11'), ('2016-02-29'), ('2016-03-01')

SELECT *
  FROM @t t 
  WHERE t.[ColonnaData] 
    BETWEEN CONVERT(date, DATEADD(MONTH, -1, DATEADD(s, 1, DATEADD(mm, DATEDIFF(m, 0, @Date), 0)))) 
      AND  CONVERT(date, DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, @Date), 0)));
--<----------
Primo Giorno Mese Scorso Ultimo Giorno Mese Scorso
------------------------ -------------------------
2016-02-01               2016-02-29

ColonnaData
-----------
2016-02-01
2016-02-11
2016-02-29


saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
88 messaggi dal 19 ottobre 2012
Grazie Moreno e Andrea.
Ho risolto brillantemente con le vostre (sempre) preziose risposte
Buona serata

Giorgio
88 messaggi dal 19 ottobre 2012
@Andrea. Si il tutto all'interno di Sql

Grazie ancora

Giorgio
11.886 messaggi dal 09 febbraio 2002
Contributi
Ah, per qualche motivo non avevo capito che la soluzione andava implementata in T-SQL. Scusate, ora che rileggo il post sembrava ovvio.
Modificato da BrightSoul il 13 marzo 2016 21.56 -

Enjoy learning and just keep making

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.