PDA

View Full Version : آرشیو ماهانه مطالب



fakhravari
یک شنبه 29 مرداد 1391, 00:21 صبح
با سلام
چطوری میتوان از میات تاریخ های زیر از هر کدوم یکی را نمایش داد و از اولین روزش
1390/01/25
1390/05/11
1390/10/01
1390/10/11
1390/10/31
1390/11/01
1390/11/25
1390/12/25
1390/12/31
مثال
1390/05/01
1390/07/01
.
.
.

mehdi.mousavi
یک شنبه 29 مرداد 1391, 12:09 عصر
با سلام چطوری میتوان از میات تاریخ های زیر از هر کدوم یکی را نمایش داد و از اولین روزش
1390/01/25
1390/05/11
1390/10/01
1390/10/11
1390/10/31
1390/11/01
1390/11/25
1390/12/25
1390/12/31
مثال
1390/05/01
1390/07/01
.
.
.

سلام.
اگر منظورتون اینه که در Range ای که داده اید، فرضا بین این سه تاریخ (در ماه 10) :

1390/10/01
1390/10/11
1390/10/31

اولی برگرده (چون از سه تای دیگه کوچکتر هستش)، و در Range فرضا

1390/12/25
1390/12/31
1390/12/02

آخری برگرده (چون بازهم در ماه 12، 02 از همه کوچکتره)، و فرض کنیم که داده ها در جدول MyTable وجود داره:

DECLARE @MyTable TABLE (
Date NVARCHAR(10)
)
INSERT INTO @MyTable
VALUES
('1390/01/25'),
('1390/05/11'),
('1390/10/01'),
('1390/10/11'),
('1390/10/31'),
('1390/11/01'),
('1390/11/25'),
('1390/12/25'),
('1390/12/31')


اونوقت می تونید بدین شکل عمل کنید:

;WITH cte AS(
SELECT
Date,
SUBSTRING(Date, 1, 4) AS Year,
SUBSTRING(Date, 6, 2) AS Month,
SUBSTRING(Date, 9, 2) AS Day
FROM @MyTable
)
SELECT Year + '/' + Month + '/' + MIN(Day) AS Date FROM cte
GROUP BY Year, Month

که خروجی این خواهد بود:


1390/01/25
1390/05/11
1390/10/01
1390/11/01
1390/12/25

موفق باشید.

fakhravari
یک شنبه 29 مرداد 1391, 13:31 عصر
دست گلت درد نکنه.
ID رکورد هم همراهش بیاید آیا شدنی؟

fakhravari
یک شنبه 29 مرداد 1391, 14:03 عصر
ممنون یافتمش.
WITH Ctegorys AS(
SELECT Date,
SUBSTRING(Date,1,4) as Year ,
SUBSTRING(Date,6,2) as Month ,
SUBSTRING(Date,9,2) as Day ,ID
FROM Table_1
)
SELECT Year + '/' + Month + '/' + MIN(Day) AS Date, Min(ID) FROM Ctegorys
GROUP BY Year,Month

mehdi.mousavi
یک شنبه 29 مرداد 1391, 14:28 عصر
سلام.
اگر ID ی شما Identity باشه و Sequential در حال اضافه شدن باشه، کدتون درسته. اما اگر به ترتیب اضافه نشه
و فرضا رکورد اول ID اش 20 باشه، اما رکورد دوم ID اش 10 باشه، اونوقت Query ای که نوشته اید نتایج صحیحی
برنمیگردونه، بنابراین این مساله رو مد نظر داشته باشید.

موفق باشید.

bftarane
دوشنبه 20 آذر 1391, 08:31 صبح
من اگه نخوام تاريخ رو به صورت String ذخيره کنم و همون DateTime باشه چطور مي تونم هم Group By بر اساس سال و ماه داشته باشم و هم تاريخي که بر اساس اون گروپ باي انجام شده برگرده؟

baktash.n81@gmail.com
دوشنبه 20 آذر 1391, 11:59 صبح
شما می تونید با استفاده از تابع DatePart یه قسمت از تاریخ رو جدا کنید ... یعنی به جای substring از DatePart استفاده کنید

neda555
پنج شنبه 19 بهمن 1391, 13:24 عصر
سلام
ضمن تشکر از جناب فخرآوری یه سوال دارم :
اگه بخواهیم از آرشیو خبر فقط 12 تای اول (دی 1391 و بهمن 1391و اسفند 1391...)را روی صفحه اصلی سایت نشون بدیم باید چه کار کنیم؟

fakhravari
پنج شنبه 19 بهمن 1391, 19:46 عصر
با سلام

فکر کنم جواب اینم بشد :متفکر:
select [Date],[ID] from
(select *, Rank() over (Partition BY SUBSTRING([Date], 6, 2) order by [ID]) as Rank
from [Table_1])tmp
where Rank = 1

اقای موسوی این تاپیک دنبال میکرد.

neda555
پنج شنبه 19 بهمن 1391, 20:10 عصر
بله درسته فکر کردم شما پست گذاشتید :)
پس از آقای موسوی و بقیه دوستان خواهشمندم هر کس میدونه سوال بنده رو پاسخ بده
من نمیدونم select رو چه جوری بنویسم که روی صفحه اصلی فقط 12 تا از این مینیمم تاریخ ها داشته باشم

fakhravari
پنج شنبه 19 بهمن 1391, 22:12 عصر
خوب من پست زدم.
به داش مهدی پیام دادم بینم کی میاد برای جواب

mohsen.net
شنبه 21 بهمن 1391, 17:12 عصر
مساله شما به Top n group معروف هست که راههای مختلفی داره .
یکی از راه هاش اینه :


SELECT *
FROM (SELECT *,
ROW_NUMBER() OVER(PARTITION BY Customerid
ORDER BY orderdate DESC) AS RecID
FROM Orders) D
WHERE RecID <= 3;

fakhravari
یک شنبه 22 بهمن 1391, 01:53 صبح
با سلام
ایا به این شکل؟
select * from
(select *, Rank() over (Partition BY SUBSTRING([Date], 6, 2) order by [ID]) as Rank
from [Table_1])tmp
where Rank <= 3

http://weblogs.sqlteam.com/jeffs/archive/2007/03/28/60146.aspx

fakhravari
یک شنبه 22 بهمن 1391, 02:13 صبح
ساختار جدول برای تست
USE [mahd]
GO
/****** Object: Table [dbo].[Table_1] Script Date: 02/10/2013 02:46:24 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Table_1](
[Date] [nvarchar](20) NULL,
[ID] [int] IDENTITY(1,1) NOT NULL,
CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[Table_1] ON
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/01/01', 18)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/01/02', 19)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/01/03', 20)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/01/04', 21)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/01/05', 22)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/01/06', 23)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/01/07', 24)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/01/12', 25)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/01/20', 26)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/01/30', 27)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/01/31', 28)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/02/04', 29)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/02/05', 30)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/02/06', 31)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/02/10', 32)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/02/25', 33)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/02/26', 34)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/02/27', 35)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/02/28', 36)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/02/29', 37)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/02/30', 38)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/02/31', 39)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/03/04', 40)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/03/05', 41)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/03/06', 42)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/03/10', 43)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/03/25', 44)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/03/26', 45)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/03/27', 46)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/03/28', 47)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/03/29', 48)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/03/30', 49)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/03/31', 50)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/02/31', 51)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/05/04', 52)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/05/05', 53)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/05/06', 54)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/05/10', 55)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/05/25', 56)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/05/26', 57)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/05/27', 58)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/05/28', 59)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/05/29', 60)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/05/30', 61)
INSERT [dbo].[Table_1] ([Date], [ID]) VALUES (N'1390/05/31', 62)
SET IDENTITY_INSERT [dbo].[Table_1] OFF

fakhravari
یک شنبه 22 بهمن 1391, 19:45 عصر
سلامی دوباره
در ادامه ارشیو ماهانه یه شکلی میگم دوستان راهنمایی کنن چطوری ساختارش پیاده کنیم


آذر 1391 (1)
آبان 1391 (1)
مهر 1391 (1)
شهريور 1391 (1)

fakhravari
یک شنبه 22 بهمن 1391, 20:38 عصر
با توجه به کار هایی که کردم تونستم اینجوری درش بیارم
2 تا فانکشن نوشتم برای نام ماه و تعداد رکورد ها در ماه
select
(SUBSTRING([Date], 1, 4)+ ' ' + dbo.GetNameMonth(SUBSTRING([Date], 6, 2))
+' ('+[dbo].[GetCountMonthPost]('1390/02/01','1390/02/31')+')'+'')as FullStatus
,
* from
(select *, Rank() over (Partition BY SUBSTRING([Date], 6, 2) order by [ID]) as Rank
from [Table_1])tmp
where Rank <= 1


فقط چطوری مقدار [GetCountMonthPost]('1390/02/01','1390/02/31') این 2 تاریخ بدیم ورودی:متفکر:

محمد سلیم آبادی
پنج شنبه 26 بهمن 1391, 19:10 عصر
دقیقا مشکل را مشخص کنید تا حد اقل بدانیم چه مساله را باید حل کنیم.
لطفا یک نمونه داده sample و نتیجه مورد نظر را تهیه کرده و در اینجا قرار دهید.

fakhravari
پنج شنبه 26 بهمن 1391, 23:59 عصر
ممنون از داش سلیم.
سوال جدید پست 15 است.
مثال دادهی هم در پست 14 زده شده.
یه چیزی حل کردم در پست 16 اما خرابه نمیتونم بازه شروع پایان مشخص کنم که count مطالب بزنه.
2 فانکشن
create FUNCTION [dbo].[GetNameMonth](@Month int)
RETURNS nvarchar(50)
AS
begin
declare @MonthName nvarchar(15);
SET @MonthName = CASE @Month
WHEN 01 THEN N'فروردين'
WHEN 02 THEN N'ارديبهشت'
WHEN 03 THEN N'خرداد'
WHEN 04 THEN N'تير'
WHEN 05 THEN N'مرداد'
WHEN 06 THEN N'شهريور'
WHEN 07 THEN N'مهر'
WHEN 08 THEN N'آبان'
WHEN 09 THEN N'آذر'
WHEN 10 THEN N'دی'
WHEN 11 THEN N'بهمن'
WHEN 12 THEN N'اسفند'
END
RETURN @MonthName
end
create FUNCTION [dbo].[GetCountMonthPost](@MonthStart nvarchar(15),@MonthFinish nvarchar(15))
RETURNS NVARCHAR(10)
AS
BEGIN
DECLARE @MonthCount nvarchar(10)
SELECT @MonthCount = count(*) FROM [Table_1] where [Date] BETWEEN @MonthStart AND @MonthFinish
RETURN @MonthCount
END

محمد سلیم آبادی
جمعه 27 بهمن 1391, 00:38 صبح
وقتی میگم نتیجه مورد نظر حداقل انتظار دارم که یه خروجی صحیح به من نشون بدین. منظورتون از عدد 1 داخل پرانتز در پست شماره 15 چیه؟ یعنی تعداد سطرهایی از جدول که در آن ماه هستند؟ خب در صورتی که بر اساس داده های نمونه ای که پست شماره 14 قرار دادین خلاف این ثابت میشه. مثلا برای فروردین 90 یازده سطر وجود داره!
و از خروجی پست شماره 16 نتیجه مورد نظر را حدس زدم! برای اینکه نتونسته بودین مسالتون رو به درستی شرح بدین...

به هر حال برای بدست آوردن تعداد سطرهای هر ماه و انتخاب اولین سطر مربوط به آن از کد زیر استفاده کنید:
select *
from
(
select *, count(*) over(partition by substring([date], charindex('/',[date])+1, 2)*1) cnt,
row_number()over(partition by substring([date], charindex('/',[date])+1, 2)*1 order by [date] ) rnk
from [dbo].[Table_1]
)t
where rnk = 1;

fakhravari
جمعه 27 بهمن 1391, 00:59 صبح
اره درسته.:لبخند:
فقط میمونه نام ماه فارسی که با فانکشن میتونیم بزاریم.

select (SUBSTRING([Date], 1, 4)+ ' ' + dbo.GetNameMonth(SUBSTRING([Date], 6, 2))
+' ('+cast(cnt as nvarchar)+')')as FullStatus , *
from
(
select *, count(*) over(partition by substring([date], charindex('/',[date])+1, 2)*1) cnt,
row_number()over(partition by substring([date], charindex('/',[date])+1, 2)*1 order by [date] ) rnk
from [dbo].[Table_1]
)t
where rnk = 1
order by [date]

fakhravari
جمعه 27 بهمن 1391, 01:17 صبح
داش سلیم اگر زحمتی نیست سرت خلوت شد یه توضیحی رو کدا بده

fakhravari
جمعه 27 بهمن 1391, 02:31 صبح
یه مشکل اساسی که

1390/02/01
1390/02/05
1390/01/01
1390/01/10
1390/12/12
1391/02/01
1391/02/05
1391/01/01
1391/01/10
1391/12/12
1390/06/12


فقط داده های 90 محاسبه میکنه .
برای سال دیگری حساب نمیکنه؟
داش سلیم چه باید کرد؟:متفکر:

fakhravari
جمعه 27 بهمن 1391, 02:53 صبح
داش سلیم خودم یه دسی توش بردم ببین این روش درسته
select (SUBSTRING([Date], 1, 4)+ ' ' + dbo.GetNameMonth(SUBSTRING([Date], 6, 2))
+' ('+cast(cnt as nvarchar)+')')as FullStatus , *
from
(
select *, count(*) over(partition by SUBSTRING([Date], 0, 8)) cnt,
row_number()over(partition by SUBSTRING([Date], 0, 8) order by [date] ) rnk
from [dbo].[Table_1]
)t
where rnk = 1
order by [date]
بر اساس ماه/سال رنکینگ میگیره

محمد سلیم آبادی
جمعه 27 بهمن 1391, 06:32 صبح
به نظر درست میاد. فقط کافی بود که قسمت Partition اش اصلاح بشه. بهتر بود به جای 0 یک قرار میدادین در تابع substring، کاراکتر صفرم معنا نداره ولی اولین کاراکتر چرا.
توضیح مختصری راجب query
قسمت تابع ranking اش را که قبلا راجبش بحث کردیم پس لازم نمی بینم که بهش دوباره به پردازیم. اما تابع count که با ماده over آمده. به این گونه توابع توابع Aggregate Window می گویند. هدف آن تابع محاسبه تعداد سطرهای مربوط به هر ماه به ازای هر سطر است. اگر میخواستیم از subquery یا جدول مشتق شده این خروجی را بدست می آوردیم، query اینگونه می شد:
select *
from
(
select
SUBSTRING([Date], 0, 8) m, count(*) as cnt
from
[dbo].[Table_1]
group by
SUBSTRING([Date], 0, 8)
)d
inner join
(
select *
from
(
select *, row_number()over(partition by SUBSTRING([Date], 0, 8) order by [date] ) rnk
from [dbo].[Table_1]
)t
where
rnk = 1
)t
on SUBSTRING(t.[Date], 0, 8) = d.m


البته با کمک تابع min هم میشه کار row_number رو انجام داد...

saeed31641
دوشنبه 21 اسفند 1391, 19:31 عصر
دوستان من تاریخ اونطوری میخام اگه میشه یه راهنمایی بکنید البته تو بانک بصورت میلادی ذخیره میکنم هااا
1390/02/01
1390/02/05
1390/03/06
1390/01/06

میخام انی نتیجه رو برگردونه

اردیبهشت 2
خرداد 1
فروردین 1

saeed31641
سه شنبه 22 اسفند 1391, 10:30 صبح
مشکلم با دو تابع Sql حل شد.متشکرم