Piotr Trychta Programista .NET
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.
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
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 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
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
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
Andrzej Matkowski Programista
Temat: Miesiące z przedziału dat
drop table #miesiacecreate 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 TomaszuSET LANGUAGE Polish
select DATENAME (mm,GETDATE())
jakby to powiedzieć, po co odkrywać koło na nowo?
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
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
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
Programista
NET,T-SQL,
Administrator
MSSQL,Progamista
C#,...
Temat: Miesiące z przedziału dat
PoprawkaSELECT 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])
Andrzej Matkowski Programista
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łubo 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
Podobne tematy
-
Bazy Danych » Baza dat -
-
Bazy Danych » Precyzja daty w Oracle - odejmowanie dat -
-
Bazy Danych » Porównywanie dat podczas użycia SELECT CASE -
-
Bazy Danych » [Oracle] Generowanie dat miesięcy w okresie obsługi z... -
-
Bazy Danych » [Access 2003] Dodawanie dat -
-
Bazy Danych » Wyświetlanie poszczególnych miesięcy z zakresu dat T-SQL. -
-
Bazy Danych » MS SQL Filtrowanie danych na podstawie dat. -
-
Bazy Danych » SQL Serwer Zapytanie tworzące tabele z datami z... -
Następna dyskusja: