Piotr Trychta

Piotr Trychta Programista .NET

Temat: Miesiące z przedziału dat

podaje 2 daty (początkową i końcową) np. '2009-01-01' i '2009-03-28' i potrzebuje funkji która mi zwróci w tym przypadku January, Feburary, March. Jak tego dokonać?
Irek Słonina

Irek Słonina programowanie, bazy
danych i linuksy

Temat: Miesiące z przedziału dat

Jeśli nadal chodzi Ci o MySQL to np. DATE_ADD() i DATE_FORMAT()
http://dev.mysql.com/doc/refman/5.1/en/date-and-time-f...
Paweł W.

Paweł W. java developer at
https://rozwoj-oprog
ramowania.pl

Temat: Miesiące z przedziału dat

Jemu chodzi raczej o MSSQL (to moze pomoc:
http://msdn.microsoft.com/en-us/library/aa258265%28v=S...
)
ale pytanie, skoro ma zwracac tylko nazwe miesiaca, to co jesli data poczatkowa bedzie 2009-01 a koncowa 2010-03 ? Bedzie problem bo nie rozroznisz roku.

Precyzuj wiec to co chcesz osiagnac
Marcin Stefaniak

Marcin Stefaniak Informatyk, Poczta
Polska

Temat: Miesiące z przedziału dat

no to dla uzupełnienia w Oracle'u do formatowania: to_date, oraz to_char (w drugą stronę).
Jeśli chciałbyś sobie napisać funkcję/procedurę która wypisuje po kolei wszystkie miesiące to przydadzą się również: months_between, add_months, round no i konstrukcja pętli, np 'for loop'.

declare
i INTEGER;
i_max INTEGER;
begin
i_max := round(months_between (to_date('2009-03-28', 'yyyy-mm-dd'), to_date('2009-01-01', 'yyyy-mm-dd')));
for i in 1..i_max loop
DBMS_OUTPUT.PUT_LINE(to_char(add_months(to_date('2009-01-01', 'yyyy-mm-dd'), i - 1), 'Month'));
end loop;
end;
/
Piotr Trychta

Piotr Trychta Programista .NET

Temat: Miesiące z przedziału dat

DECLARE @StartDate as datetime;
DECLARE @EndDate as datetime;
SET @StartDate='2006-09-24'
SET @EndDate='2008-03-01'

DECLARE @MONTS AS TABLE (monthyear varchar(20))
WHILE DATEDIFF(hour, @StartDate, @EndDate) > 0

BEGIN

INSERT INTO @MONTS(monthyear) VALUES(CONVERT(CHAR(7), @StartDate, 120))
SET @StartDate = DATEADD(month, 1, @StartDate)

END
SELECT monthyear FROM @MONTS

i działa

konto usunięte

Temat: Miesiące z przedziału dat

Piotr Trychta:
DECLARE @StartDate as datetime;
DECLARE @EndDate as datetime;
SET @StartDate='2006-09-24'
SET @EndDate='2008-03-01'

DECLARE @MONTS AS TABLE (monthyear varchar(20))
WHILE DATEDIFF(hour, @StartDate, @EndDate) > 0

BEGIN

INSERT INTO @MONTS(monthyear) VALUES(CONVERT(CHAR(7), @StartDate, 120))
SET @StartDate = DATEADD(month, 1, @StartDate)

END
SELECT monthyear FROM @MONTS

i działa

zrobisz coś takiego też za pomocą CTE
http://www.kodyaz.com/articles/sql-server-dates-table-...
Krzysztof Szelążek

Krzysztof Szelążek Senior .net
Developer

Temat: Miesiące z przedziału dat

Jezeli posiadasz tabele z datami wystarczy uzyc tego zapytania:

SELECT MONTHNAME(date)
FROM table
WHERE date BETWEEN :begin AND :end
GROUP BY MONTHNAME(date)Krzysztof Szelążek edytował(a) ten post dnia 24.08.10 o godzinie 17:06
Tomasz Kozakiewicz

Tomasz Kozakiewicz Programista
NET,T-SQL,
Administrator
MSSQL,Progamista
C#,...

Temat: Miesiące z przedziału dat

W MSSQL :

SELECT DATENAME(mm,_data) from ....

żeby było po polsku, zrób tabelę:

CREATE TABLE [dbo].[Mce](
[Nr] [int] NOT NULL,
[NazwaMc] [varchar](50) COLLATE Polish_CI_AS NOT NULL
) ON [PRIMARY]

wpisz numery i nazwy miesięcy

i dopisz funkcję:

CREATE FUNCTION dbo.MonthName (@Data datetime)
RETURNS varchar(50)
AS
BEGIN
declare @nmc varchar(50)
declare @NrMc int
SELECT @NrMc=Month(@Data)
if @NrMc between 1 and 12
begin
SELECT @nmc=NazwaMc FROM dbo.Mce WHERE Nr=@NrMc
end
else
begin
-- obsługa błędu albo nie zwracamy nic
SET @nmc=''
end
RETURN @nmc
ENDTomasz Kozakiewicz edytował(a) ten post dnia 24.08.10 o godzinie 19:28

Temat: Miesiące z przedziału dat

drop table #miesiace
create table #miesiace (nr int, mc varchar(15))
insert into #miesiace select 1, 'Styczeń'
insert into #miesiace select 2, 'Luty'
insert into #miesiace select 3, 'Marzec'
insert into #miesiace select 4, 'Kwiecień'
insert into #miesiace select 5, 'May'
insert into #miesiace select 6, 'Czerwiec'
insert into #miesiace select 7, 'Lipiec'
insert into #miesiace select 8, 'Sierpień'
insert into #miesiace select 9, 'Wrzesień'
insert into #miesiace select 10, 'Październik'
insert into #miesiace select 11, 'Listopad'
insert into #miesiace select 12, 'Grudzień'

drop table #mc_wybrane
create table #mc_wybrane (rok int, nr int, mc varchar(15))

declare @dat_begin datetime, @dat_end datetime, @k int
set @dat_begin='2009-01-01'
set @dat_end='2009-03-28'
set @k=0

--ustawiam daty na początki miesiąca
set @dat_begin=cast(cast(year(@dat_begin) as char(4))+'-'+right('00'+cast(month(@dat_begin) as varchar(2)),2)+'-01 ' as datetime)
set @dat_end=cast(cast(year(@dat_end) as char(4))+'-'+right('00'+cast(month(@dat_end) as varchar(2)),2)+'-01 ' as datetime)

while dateadd(month, @k, @dat_begin)<=@dat_end
begin
insert into #mc_wybrane select year(dateadd(month, @k, @dat_begin)), * from #miesiace where nr=month(dateadd(month, @k, @dat_begin))
set @k=@k+1
end

--tutaj wyniki
select * from #mc_wybrane

powodzenia :)

konto usunięte

Temat: Miesiące z przedziału dat

panowie Andrzeju i Tomaszu

SET LANGUAGE Polish
select DATENAME (mm,GETDATE())

jakby to powiedzieć, po co odkrywać koło na nowo?
Tomasz Kozakiewicz

Tomasz Kozakiewicz Programista
NET,T-SQL,
Administrator
MSSQL,Progamista
C#,...

Temat: Miesiące z przedziału dat

To jest wprawdzie najprostsze rozwiązanie,ale posiada duży mankament że musimy pamiętać ,bądź ustawiać również format dat. Dla przykładu:

SET LANGUAGE English
DECLARE @Today DATETIME
SET @Today = '2007/12/1'

select DATENAME (mm,@today)

wynik = december

SET LANGUAGE Polish
DECLARE @Today DATETIME
SET @Today = '2007/12/1'

select DATENAME (mm,@today)

wynik = styczeń

A tak żeby było w temacie to proponuje takie rozwiązanie , uproszczone bo zakładam że daty są z jednego roku, inaczej trzeba zwracać rok i miesiąc:

CREATE TABLE [dbo].[Mce](
[Nr] [int] NOT NULL,
[NazwaMc] [varchar](50) COLLATE Polish_CI_AS NOT NULL
) ON [PRIMARY]
--dodajemy numery i nazwy miesięcy

create procedure mce_z_dat (@dataod datetime,@datado datetime)
as
begin
declare @miesiacod int
declare @miesiacdo int
SET @miesiacod=MONTH(@dataod)
SET @miesiacdo=MONTH(@datado)
create table #miesiace(mc int)
if YEAR(@dataod)=YEAR(@datado)
begin
while @miesiacod<= @miesiacdo
begin
insert into #miesiace(mc) values(@miesiacod)
SET @miesiacod=@miesiacod+1
end
end
SELECT NazwaMc FROM #miesiace JOIN Mce ON Nr=mc
endTomasz Kozakiewicz edytował(a) ten post dnia 26.08.10 o godzinie 23:50

konto usunięte

Temat: Miesiące z przedziału dat

Tomasz Kozakiewicz:
To jest wprawdzie najprostsze rozwiązanie,ale posiada duży mankament że musimy pamiętać ,bądź ustawiać również format dat. Dla przykładu:

SET LANGUAGE English
DECLARE @Today DATETIME
SET @Today = '2007/12/1'

select DATENAME (mm,@today)

wynik = december

SET LANGUAGE Polish
DECLARE @Today DATETIME
SET @Today = '2007/12/1'

select DATENAME (mm,@today)

wynik = styczeń

set language us_english

if @@langid <> 14 SET LANGUAGE Polish
select DATENAME (mm,GETDATE()) as miesiąc, DATENAME (dw,GETDATE()) as dzień

można sobie sprawdzić jaki język jest na tapecie
Tomasz Kozakiewicz

Tomasz Kozakiewicz Programista
NET,T-SQL,
Administrator
MSSQL,Progamista
C#,...

Temat: Miesiące z przedziału dat

Panie Przemysławie, to jest kwestia nawyków jakie stosujemy w programowaniu. Ja wolę nie sprawdzać w każdym zapytaniu jakie mamy ustawienia lokalne itp., gdyż może to powodować potencjalny błąd jak o tym zapomnę.
Nie mniej jednak to o czym dyskutujemy nie odnosi się do tematu początkowego.

konto usunięte

Temat: Miesiące z przedziału dat

Tomasz Kozakiewicz:
Panie Przemysławie, to jest kwestia nawyków jakie stosujemy w programowaniu. Ja wolę nie sprawdzać w każdym zapytaniu jakie mamy ustawienia lokalne itp., gdyż może to powodować potencjalny błąd jak o tym zapomnę.

nie ma potrzeby sprawdzania za każdym razem, tylko w momencie gdy nam jest to potrzebne, tudzież można dynamicznie się przełączyć z językiem na polski tak na moment w momencie kiedy tego potrzebujemy bez zbędnego zawracania sobie głowy aktualnym językiem

set language us_english

declare @lang nvarchar(50)
select @lang = alias from sys.syslanguages where langid = @@langid
SET LANGUAGE Polish
select DATENAME (mm,GETDATE()) as miesiąc, DATENAME (dw,GETDATE()) as dzień
SET LANGUAGE @lang

select @@language
Nie mniej jednak to o czym dyskutujemy nie odnosi się do tematu początkowego.

chodzi o odkrywanie koła na nowo, po co skoro można wykorzystać już jakiś mechanizm np. CTE zamiast pętli WHILEPrzemysław R. edytował(a) ten post dnia 27.08.10 o godzinie 13:09
Tomasz Kozakiewicz

Tomasz Kozakiewicz Programista
NET,T-SQL,
Administrator
MSSQL,Progamista
C#,...

Temat: Miesiące z przedziału dat

Nie rozumiem po co jest drążenie funckji Datename skoro temat jest zupełnie inny i tej funcji nie można użyć w danym problemie. Poza tym CTE działa od MSSQL2005 i jeśli Pan chce to proszę podać rozwiązanie dla problemu z tematu postu przy użyciu tego mechanizmu.

konto usunięte

Temat: Miesiące z przedziału dat

Tomasz Kozakiewicz:
Nie rozumiem po co jest drążenie funckji Datename skoro temat jest zupełnie inny i tej funcji nie można użyć w danym problemie. Poza tym CTE działa od MSSQL2005 i jeśli Pan chce to proszę podać rozwiązanie dla problemu z tematu postu przy użyciu tego mechanizmu.

declare @start nvarchar(10)
declare @stop nvarchar(10)

set @start = '20090601'
set @stop = '20090630'

;WITH CTE_DatesTable
AS
(
SELECT CAST(@start as datetime) AS [date]
UNION ALL
SELECT DATEADD(dd, 1, [date])
FROM CTE_DatesTable
WHERE DATEADD(dd, 1, [date]) <= CAST(@stop as datetime)
)
SELECT [date] FROM CTE_DatesTable
OPTION (MAXRECURSION 0);
Tomasz Kozakiewicz

Tomasz Kozakiewicz Programista
NET,T-SQL,
Administrator
MSSQL,Progamista
C#,...

Temat: Miesiące z przedziału dat

Poprawka

SELECT Datename(mm,[date]) FROM CTE_DatesTable group by Datename(mm,[date])

i w przypadku kiedy mamy zakres dat od 2010.01.01 do 2010.12.31 rekurencja wykona się 364 razy, natomiast w moim przykładzie maksymalnie 12. Więc myślę że nie jest to efektywne.

konto usunięte

Temat: Miesiące z przedziału dat

Tomasz Kozakiewicz:
Poprawka

SELECT Datename(mm,[date]) FROM CTE_DatesTable group by Datename(mm,[date])

i w przypadku kiedy mamy zakres dat od 2010.01.01 do 2010.12.31 rekurencja wykona się 364 razy, natomiast w moim przykładzie maksymalnie 12. Więc myślę że nie jest to efektywne.

trzeba tylko zmienić dd na m w SELECT DATEADD(m, 1, [date])

Temat: Miesiące z przedziału dat

a co zwróci ten kod dla dat '2010-01-26' i '2010-03-12'?
czy nie zwróci za mało miesięcy? po mojemu nie zwróci marca a powinna chyba...

konto usunięte

Temat: Miesiące z przedziału dat

to teraz trzeba się zapytać czy chcemy dowolne miesiące z przedziału czasowego czy też pełne miesiąca z tegoż przedziału

bo jeżeli pełne to trzeba zrobić manewr taktyczny z przebudową daty końca na wskazującą ostatni dzień miesiąca np. tak:

declare @dstop as datetime
set @dstop = getdate()
set @dstop = dateadd(d,-1,dateadd(mm,1,convert(datetime,cast(year(@dstop) as nvarchar(4)) + '-01-' + RIGHT('0' + cast(MONTH(@dstop) as nvarchar(4)),2) )))
select @dstop

Następna dyskusja:

Baza dat




Wyślij zaproszenie do