এসকিউএল সার্ভার 2005/2008 এ সপ্তাহের দিন পান


368

আমার যদি 01/01/2009 তারিখ থাকে তবে আমি জানতে চাই যে এটি কোন দিন ছিল, যেমন সোমবার, মঙ্গলবার ইত্যাদি ...

এসকিউএল সার্ভার 2005/2008 এ এর ​​জন্য কি কোনও অন্তর্নির্মিত ফাংশন রয়েছে? বা আমার একটি সহায়ক টেবিল ব্যবহার করা উচিত?


1
তারিখের অংশগুলির জন্য যদি আপনার কাছে কোনও টেবিল থাকে তবে আপনি সাধারণত কিছু ভুল করেছেন। এসকিউএল সার্ভারের তারিখ ফাংশনগুলি অনেকগুলি এবং শক্তিশালী তাই আপনার একটি তারিখ থেকে নিষ্কাশনের জন্য যে কোনও ডেটা প্রয়োজন তা সহজেই একটি ডেটটাইম কলামে করা যেতে পারে।
বেনিয়ামিন অটিন

6
তারিখ গণনার জন্য সহায়ক টেবিলগুলি খুব কার্যকর, একটি ক্যালেন্ডার সহায়ক টেবিল থাকা অস্বাভাবিক নয় ...

2
"তারিখ গণনার জন্য দরকারী" অত্যন্ত সন্দেহজনক। বেশিরভাগ তারিখ গণনাগুলি কোনও ধরণের সহায়ক টেবিল ছাড়াই পরিচালনা করা যায় এবং এটি আরও ভাল সম্পাদন করবে। কিছু ক্ষেত্রে, একটি সরল নম্বর টেবিলটি কাজটি করবে - এতে প্রকৃত তারিখ সহ কোনও টেবিলের প্রয়োজন হবে না। একমাত্র কারণ আমি দেখেছি যে একটি সত্যিকারের ক্যালেন্ডার সারণির প্রয়োজনীয়তা হল যখন নিয়মগুলি হয় যার জন্য দিনগুলি কাজের দিন এবং কোন দিনগুলি খুব জটিল নয়। আমি খুব বেশিবার যা দেখেছি তা হ'ল লোকেরা ডেট টেবিল ব্যবহার করে কারণ তারা এটি অন্য কোনও উপায়ে কীভাবে করবেন তা জানেন না। তারপরে তাদের প্রতিবার প্রায়শই তারিখের টেবিলটি পপুলেশন করতে হবে। সিলি।
এরিক

5
আমি আমার শব্দগুলি খাবো যদি আপনি আমাকে ক্যালেন্ডার টেবিলগুলির জন্য এমন একটি ব্যবহার দেখিয়ে দিতে পারেন যে 1) জটিল ছুটির দিন / কর্ম দিবসের নিয়মের জন্য নয়, 2) বিল্ট-ইন ফাংশনগুলি দিয়ে সহজেই করা যাবে না, এবং 3) কেবল যদি না # 2, তারপরে একটি নম্বর টেবিল ঠিক পাশাপাশি কাজ করে এবং নির্দিষ্ট তারিখের সাথে টেবিলটি পপুলিংয়ের প্রয়োজন হয় না।
এরিক

2
ডেটা গুদামগুলি ক্যালেন্ডার সারণির ব্যাপক ব্যবহার করে। পূর্বনির্ধারিত মাস, প্রান্তিক বছর, বছর ইত্যাদি শেষ ব্যবহারকারীদের ক্ষেত্রগুলি সরবরাহ করে যা তারা বিপরীতে ফিল্টার করতে / সমষ্টি করতে পারে।
ডেভিড রাশটন

উত্তর:


693

ব্যবহার করুন DATENAMEবা DATEPART:

SELECT DATENAME(dw,GETDATE()) -- Friday
SELECT DATEPART(dw,GETDATE()) -- 6

thx, আমি তারিখের চেষ্টা করেছিলাম কিন্তু d ব্যবহার করেছি, আমাকে পূর্ণসংখ্যা ফেরত দিয়েছি। dw আশানুরূপ কাজ করে

39
এজন্য আমি নির্বাচিত তারিখের নাম (সপ্তাহের দিন, গেটডেট ()) ব্যবহার করতে পছন্দ করি। আমাকে মনে রাখতে হবে না যে ডিডাব্লু সপ্তাহের দিন ফিরে আসে .... যখন আমি পরিবর্তে "সাপ্তাহিক দিন" ব্যবহার করতে পারি।
জর্জ মাস্ত্রোস

9
যে কেউ এ সম্পর্কে ঝুঁকছেন - মনে রাখবেন যে সপ্তাহের ডিফল্ট শুরুটি রবিবার । কীভাবে নিরাপদে তা পরিবর্তন করতে পারে তার জন্য @ সং এর জবাবটি দেখুন
জনিআআআআআআআআআআআআআআআআআআআগে।

2
@niico কারণ এটি এসকিউএল সূচকগুলি 1 থেকে এবং সি 0 থেকে ভাষা সূচক পছন্দ করে
ইউজার 824276

95

এসকিউএলমেনিসের উত্তর গৃহীত হলেও, SETআপনার একটি সচেতন হওয়া উচিত একটি গুরুত্বপূর্ণ বিকল্প

তারিখ সেট করুন

DATENAME সঠিক তারিখ ফিরে আসবে নাম একই কিন্তু DATEPART মান যদি সপ্তাহের প্রথম দিন নিচের সচিত্র পরিবর্তন করা হয়েছে।

declare @DefaultDateFirst int
set @DefaultDateFirst = @@datefirst
--; 7 First day of week is "Sunday" by default
select  [@DefaultDateFirst] = @DefaultDateFirst 

set datefirst @DefaultDateFirst
select datename(dw,getdate()) -- Saturday
select datepart(dw,getdate()) -- 7

--; Set the first day of week to * TUESDAY * 
--; (some people start their week on Tuesdays...)
set datefirst 2
select datename(dw,getdate()) -- Saturday
--; Returns 5 because Saturday is the 5th day since Tuesday.
--; Tue 1, Wed 2, Th 3, Fri 4, Sat 5
select datepart(dw,getdate()) -- 5 <-- It's not 7!
set datefirst @DefaultDateFirst

33
সুতরাং স্থির ডেট পার্ট মান পেতে, আপনি কি ( @@datefirst - 1 + datepart(weekday, thedate) ) % 7। রবিবার সর্বদা শূন্য হবে।
এন্ডে তজাহজনো

1
এই ধরণের স্টাফটি স্থিতিশীল তাই আপনাকে কোয়েরিটি মূল, মান পরিবর্তন করতে, ক্যোয়ারি চালাতে, মূল প্যাটার্নটি পুনরায় সেট করতে হবে
JonnyRaa

2
এর মজার অংশটি হ'ল। নেট এর DayOfWeekগণনাটি রয়েছে DayOfWeek.Sunday... এর মান সহ 0। সুতরাং, সেট করা যাই হোক না কেন DateFirst, একটি চিকিত্সাবিহীন এসকিউএল-ফেরত WEEKDAYমান কখনই নেট নেট অংশের সাথে সামঞ্জস্য হয় না। ইয়ে, মাইক্রোসফ্ট।
এরিক উ

26
SELECT  CASE DATEPART(WEEKDAY,GETDATE())  
    WHEN 1 THEN 'SUNDAY' 
    WHEN 2 THEN 'MONDAY' 
    WHEN 3 THEN 'TUESDAY' 
    WHEN 4 THEN 'WEDNESDAY' 
    WHEN 5 THEN 'THURSDAY' 
    WHEN 6 THEN 'FRIDAY' 
    WHEN 7 THEN 'SATURDAY' 
END

26
আপনার জানা উচিত যে থের এটি অর্জনের জন্য একটি বিল্ট ইন ফাংশন। select datename(dw,getdate())
সোহম দাশগুপ্ত

10
@ সোহমদাসগুপ্ত এই ফাংশনটিতে নির্মিত এমএস এসকিউএল-এর অ-ইংরাজী সংস্করণে একই ফল দেয় না।
মিঃ স্কেপগ্র্যাস

12

নির্দিষ্ট তারিখের জন্য সপ্তাহের দিনের জন্য একটি নির্বিচার মান পেতে আপনি তারিখ পার্ট () এবং @@ তারিখের প্রথমটির সংমিশ্রণটি ব্যবহার করতে পারেন । অন্যথায় সার্ভারের সেটিংসের উপর আপনার নির্ভরশীল।

আরও ভাল সমাধানের জন্য নিম্নলিখিত সাইটটি দেখুন: এমএস এসকিউএল: সপ্তাহের দিন

সপ্তাহের দিনটি 0 থেকে 6 এর মধ্যে থাকবে যেখানে 0 রবিবার, 1 সোমবার ইত্যাদি, তারপরে আপনি সপ্তাহের সঠিক নামটি ফিরিয়ে দিতে একটি সাধারণ কেস স্টেটমেন্ট ব্যবহার করতে পারেন।


5
দয়া করে উত্তরের উত্তরটি রেখে দিন যাতে লোকেরা এটির জন্য কোনও লিঙ্কে ক্লিক না করে।
মার্টিন স্মিথ

11

ইউরোপ:

declare @d datetime;
set @d=getdate();
set @dow=((datepart(dw,@d) + @@DATEFIRST-2) % 7+1);

2
আপনার কোডটি কী করে এবং এটি কীভাবে প্রশ্নের উত্তর দেয় তার ব্যাখ্যা অন্তর্ভুক্ত করুন। যদি আপনি উত্তর হিসাবে একটি কোড স্নিপেট পান তবে আপনি এটির কী করবেন তা জানেন না। উত্তরে ওপি এবং ভবিষ্যতের দর্শকদের কীভাবে তাদের ডিবাগ করতে হবে এবং তাদের সমস্যার সমাধান করতে হবে তার গাইডেন্স দিতে হবে। আপনার কোডের পেছনের ধারণাটি কী, তা নির্দেশ করে, সমাধানটি কার্যকরভাবে প্রয়োগ করতে এবং আপনার সমাধানটি প্রয়োগ বা পরিবর্তন করতে সহায়তা করে।
প্যালিক


3

এটি আমার কোডের একটি কার্যকরী অনুলিপি এটি পরীক্ষা করে দেখুন, কীভাবে দিনের নাম থেকে এসকিএল এ পুনরুদ্ধার করা যায়

CREATE Procedure [dbo].[proc_GetProjectDeploymentTimeSheetData] 
@FromDate date,
@ToDate date

As 
Begin
select p.ProjectName + ' ( ' + st.Time +' '+'-'+' '+et.Time +' )' as ProjectDeatils,
datename(dw,pts.StartDate) as 'Day'
from 
ProjectTimeSheet pts 
join Projects p on pts.ProjectID=p.ID 
join Timing st on pts.StartTimingId=st.Id
join Timing et on pts.EndTimingId=et.Id
where pts.StartDate >= @FromDate
and pts.StartDate <= @ToDate
END

1

আপনি যদি নির্ভর করতে @@DATEFIRSTবা ব্যবহার করতে না চান তবে DATEPART(weekday, DateColumn)কেবল সপ্তাহের দিনটি নিজেই গণনা করুন।

সোমবার ভিত্তিক সপ্তাহের জন্য (ইউরোপ) সবচেয়ে সহজ:

SELECT DATEDIFF(day, '17530101', DateColumn) % 7 + 1 AS MondayBasedDay

রবিবার ভিত্তিক সপ্তাহের জন্য (আমেরিকা) ব্যবহার করুন:

SELECT DATEDIFF(day, '17530107', DateColumn) % 7 + 1 AS SundayBasedDay

এটি 1 লা জানুয়ারীর পর থেকে সপ্তাহের দিন সংখ্যা (1 থেকে 7) যথাক্রমে 7 ম, 1753 এ ফিরে আসবে।


1

আপনি ব্যবহার করতে পারেন DATEPART(dw, GETDATE())তবে সচেতন হন যে ফলাফলটি এসকিউএল সার্ভার সেটিং @@DATEFIRSTমানের উপর নির্ভর করবে যা সপ্তাহের প্রথম সেটিংয়ের (ইউরোপের ডিফল্ট মান which যা রবিবারে)।

আপনি যদি সপ্তাহের প্রথম দিনটিকে অন্য কোনও মানতে পরিবর্তন করতে চান তবে আপনি ব্যবহার করতে পারেন SET DATEFIRSTতবে এটি আপনার জিজ্ঞাসা সেশনের যেকোন জায়গায় প্রভাব ফেলতে পারে যা আপনি চান না।

বিকল্প উপায় হ'ল প্রথম দিনটিকে প্যারামিটার হিসাবে স্পষ্ট করে নির্দিষ্ট করা এবং @@DATEFIRSTসেটিংসের উপর নির্ভর করে এড়ানো । এটি যখন প্রয়োজন তখন আপনি তা অর্জন করতে নিম্নলিখিত সূত্রটি ব্যবহার করতে পারেন:

(DATEPART(dw, GETDATE()) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1

যেখানে @WeekStartDayসপ্তাহে আপনি আপনার সিস্টেমের জন্য চান প্রথম দিন (1 থেকে 7 যা সোমবার রবিবার যাও বিত্ত) হয়।

আমি এটিকে নীচে ফাংশনে আবদ্ধ করেছি যাতে আমরা এটি সহজেই পুনরায় ব্যবহার করতে পারি:

CREATE FUNCTION [dbo].[GetDayInWeek](@InputDateTime DATETIME, @WeekStartDay INT)
RETURNS INT
AS
BEGIN
    --Note: @WeekStartDay is number from [1 - 7] which is from Monday to Sunday
    RETURN (DATEPART(dw, @InputDateTime) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1 
END

ব্যবহারের উদাহরণ: GetDayInWeek('2019-02-04 00:00:00', 1)

এটি অনুসরণ করার সমান (তবে এসকিউএল সার্ভার DATEFIRST সেটিং থেকে স্বতন্ত্র):

SET DATEFIRST 1
DATEPART(dw, '2019-02-04 00:00:00')

0

আপনি এই সংস্করণটি দরকারী দেখতে পাবেন।

-- Test DATA
select @@datefirst
create table #test (datum datetime)
insert #test values ('2013-01-01')
insert #test values ('2013-01-02')
insert #test values ('2013-01-03')
insert #test values ('2013-01-04')
insert #test values ('2013-01-05')
insert #test values ('2013-01-06')
insert #test values ('2013-01-07')
insert #test values ('2013-01-08')
-- Test DATA

select  Substring('Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun,Mon,Tue,Wed,Thu,Fri,Sat',
        (DATEPART(WEEKDAY,datum)+@@datefirst-1)*4+1,3),Datum
        from #test 

1
এটি অবচলিত কোড, এবং এটি কী করছে বা অর্জন করার চেষ্টা করছে তার কোনও ইঙ্গিত দেয় না
brewmanz
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.