Post by Lorenzo BenagliaPost by NorbyVorrei fare una select nel DB che mi restituisca solo le entry che hanno sul
campo data (datetime) un giorno del mese/anno nel quale siamo.
Ciao Norby,
Il problema consiste semplicemente nell'escogitare un modo per determinare
l'ultimo giorni del mese.
Una soluzione potrebbe essere quella di definire una UDF che tramite le
funzioni DATEDIFF() e DATEADD() vada a determinare tale valore.
L'algoritmo sembra "incasinato" ma in realtà è molto semplice: come prima
cosa si calcola il numero di mesi intercorsi tra la data passata come
argomento e la base date di SQL Server (1 gennaio 1900 equivalente
all'intero 0) sommando 1 mese, poi si aggiuge tale valore espresso in mesi
alla base date detraendo 1 giorno.
USE tempdb;
GO
CREATE TABLE dbo.Articoli(
ID int NOT NULL PRIMARY KEY,
Articolo varchar(20) NOT NULL,
Data datetime NOT NULL
);
INSERT dbo.Articoli VALUES
(1, 'FASCAW', '20090531')
, (2, 'ABCDEFG', '20090901')
, (3, 'ASDFAXX', '20090921')
, (4, 'ZDFWFGG', '20091003');
GO
CREATE FUNCTION dbo.ufn_GetLastMonthDay(
@Today datetime
)
RETURNS datetime
BEGIN
END
GO
varchar(2)), 2) + '01';
SELECT *
FROM dbo.Articoli
ID Articolo Data
----------- -------------------- -----------------------
2 ABCDEFG 2009-09-01 00:00:00.000
3 ASDFAXX 2009-09-21 00:00:00.000
(2 row(s) affected)
*/
DROP FUNCTION dbo.ufn_GetLastMonthDay;
DROP TABLE dbo.Articoli;
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
Ciao Lorenzo!.
In primis, grazie per l'aiuto. Vorrei chiederti qualche chiarimento in
merito al codice da te riportato...
Naturalmente io non devo ricreare la tabella in quanto esiste già quindi la
parte di costruzione tabella che hai riportato non mi serve :
=====================
USE tempdb;
GO
CREATE TABLE dbo.Articoli(
ID int NOT NULL PRIMARY KEY,
Articolo varchar(20) NOT NULL,
Data datetime NOT NULL
);
=====================
E i valori idem
=====================
INSERT dbo.Articoli VALUES
(1, 'FASCAW', '20090531')
, (2, 'ABCDEFG', '20090901')
, (3, 'ASDFAXX', '20090921')
, (4, 'ZDFWFGG', '20091003');
GO
=====================
Passiamo alla funtion..
Devo inserirla in una Stored Procedure?
Perchè io la devo interpretare poi da ASP.NET mediante un datareader
Quindi non so se devo inglobare tutto quanto hai scritto in una super
stringa oppure mettere il todos in una SP e richiamarla..
Ad ogni modo, mettiamo che prendo una stored procedure:
Devo scrivere questo:
CREATE FUNCTION dbo.ufn_GetLastMonthDay(
@Today datetime
)
RETURNS datetime
BEGIN
RETURN DATEADD(month, DATEDIFF(month, 0, @Today) + 1, 0) - 1;
END
GO
DECLARE @Month int = OXOXOXOXOXOXOXOXOX, @Year int = OXOXOXOXOXOXOXOXOX;
DECLARE @From datetime = CAST(@Year AS char(4)) + LEFT('0' + CAST(@Month as
varchar(2)), 2) + '01';
DECLARE @To datetime = dbo.ufn_GetLastMonthDay(@From);
SELECT *
FROM dbo.Articoli
WHERE Data BETWEEN @From AND @To;
============================================
Dove ho scritto:
OXOXOXOXOXOXOXOXOX
OXOXOXOXOXOXOXOXOX
Gli devo passare le 2 variabili di cui parlavo prima giusto? in formato
intero.
Se ho capito bene, passo a provare :-)
Grazie! Norby