آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

آموزش کار با نوع داده Date در SQL

دوره های مرتبط با این مقاله

ذخیره و نمایش مقدار تاریخ: نوع داده ای Date در SQL

این نوع داده ای در اصل برای ذخیره ی تاریخ مورد استفاده قرار می گیرد. قالب رشته ای آن به صورت YYYY-MM-DD می باشد که YYYY محدوده عددی 0001 تا 9999 را برای نمایش سال و MM بازه عددی 01 تا 12 را ویژه ی نشان دادن ماه و DD برد 01 تا 31 را با توجه به ماه مورد نظر، برای نمایش روز می توانند در بر گیرند. مقدار از پیش تعیین شده ی این نوع داده ای در sql، 01-01-1900 می باشد. میزان حافظه لازم برای ذخیره ی اطلاعات متغیر با این نوع داده ای 3 بایت بوده و همیشه ثابت می باشد.

آموزش کاربردی

  1. محیط SQL Server را راه اندازی نموده و بر روی دکمه ی Connect در پنجره ی اتصال به سرور کلیک نمایید.
  2. در پنجره ی Object Explorer، بر روی اسم Server کلیک کرده و سپس گزینه ی New Query را انتخاب نمایید.
  3. به Taskbar مراجعه کرده و سپس Start -> All Programs -> Accessories -> Windows Powershell -> Windows Powershell .

نوع Date

برای پشتیبانی از تاریخ و زمان، T-SQL نوع داده ای DATE را تعبیه کرده است. نوع داده ی مذکور قادر است روزها را از تاریخ 1 ژانویه سال 0001 تا 31 دسامبر سال 9999 شمرده (ذخیره کرده) و نمایش دهد. برای نمایش date باید یک سری تنظیمات لازم را انجام دهید. جهت انجام تنظیمات، باید Control Panel -> Regional and Language Options -> Customize Regional Options -> Date. در اینجا می توانید فرمت نمایش تاریخ را پیکربندی کنید:
آموزش SQL

ایجاد یک متغیر از نوع Date

برای مقداردهی اولیه (INITIALIZE) یک متغیر از نوع DATE، یکی از فرمت های زیر را بکار می بریم:


YYYYMMDD
YYYY-MM-DD
MM-DD-YY
MM-DD-YYYY
MM/DD/YY
MM/DD/YYYY
DD-MMM-YY
DD-MMMM-YY
DD-MMM-YYYY
DD-MMMM-YYYY

می توانید مقدار را با یک سال که در قالب 4 رقم نمایش داده می شود شروع کنید. در صورت استفاده از فرمول اول، YYYYMMDD، بایستی 4 عدد برای نمایش سال، 2 عدد برای نمایش ماه و در پایان دو رقم برای نمایش روز فراهم کنید.


مثال:
DECLARE @OneDay DATE;
SET @OneDay = N'10360610';
SELECT @OneDay AS [Day to Prevail];
GO

این مثال تاریخ 6 اُکتبر، 1036 را نمایش می دهد:
آموزش SQL

می توانید مقدار را در قالب یک واحد با 6 عدد نمایش دهید. این نمونه، دو عدد سمت چپ نمایش گر در قرن جاری می باشد. بجای ارائه ی کل مقدار در قالب یک ترکیب 6 عددی (بدون هیچ گونه تفکیک گر)، می توان فرمول دوم ،YYYY-MM-DD، را که فرمت پیش فرض نمایش تاریخ در مایکروسافت اس کیو ال می باشد، مورد استفاده قرار داد. در این فرمول نیز باید برای سال 4 عدد ارائه کرده، تفکیک گر "-" را پس از آن درج نمایید و بلافاصله 1 تا 2 رقم به نشانه ی ماه، تفکیک گر "-" و در پایان 1 یا 2 عدد برای روز مشخص نمایید.


مثال:
DECLARE @EventDay date;
SET @EventDay = N'1914-4-7';
SELECT @EventDay AS [Event Day];
GO

نتیجه ی زیر را برمی گرداند:
آموزش SQL

در صورت استفاده از پنجره ی فرمان نظیر COMMAND PROMPT یا PowerShell برای اجرای دستورات sql، لازم است مقادیر را داخل تک کوتیشن محصور نمایید. جهت تبدیل مقدار به کاراکترهای Unicode بایستی پیش از آن پیشوند N را درج نمایید.


مثال:
1>
DECLARE @IndependenceDay DATETIME;
2> SET @IndependenceDay = N'01/01/1960';
3> SELECT @IndependenceDay AS [Independence Day];
4> GO
Independence Day
-----------------------
1960-01-01 00:00:00.000
(1 rows affected)

دیدیم که در صورت استفاده از فرمت MM-DD-YY یا MM/DD/YY، باید دو رقم برای نمایش سال درنظر بگیریم. در این فرمت:
1. اگر عددی که سال را نمایش می دهد کوچکتر از 50 باشد، سال متعلق به قرن جاری تلقی می شود.
2. چنانچه عددی که سال را نمایش می دهد بزرگتر از 50 باشد، سال متعلق به قرن پیشین محسوب می شود.


1. داخل Query Editor، دستورات زیر را تایپ نمایید:


DECLARE @SomeDate Date;
SET	@SomeDate = N'5-7-05';
PRINT	@SomeDate;
GO
PRINT N'-----------';
GO
DECLARE @SomeDate Date;
SET	@SomeDate = N'5/7/05';
PRINT	@SomeDate;
GO
PRINT N'-----------';
GO
DECLARE @SomeDate Date;
SET	@SomeDate = N'5-7-41';
PRINT	@SomeDate;
GO
PRINT N'-----------';
GO
DECLARE @SomeDate Date;
SET	@SomeDate = N'5/7/41';
PRINT	@SomeDate;
GO
PRINT N'-----------';
GO
DECLARE @SomeDate Date;
SET	@SomeDate = N'5-7-81';
PRINT	@SomeDate;
GO
PRINT N'-----------';
GO
DECLARE @SomeDate Date;
SET	@SomeDate = N'5/7/81';
PRINT	@SomeDate;
GO
PRINT N'-----------';
GO

2. برای جرای کد فوق، کلید F5 را فشار دهید.


آموزش SQL

3. داخل پنجره ی Query Editor کلیک کرده و کلیدهای Ctrl + A را برای انتخاب تمامی دستورات همزمان فشار دهید.
4. دستورات زیر را وارد نمایید:


DECLARE @FirstName    nvarchar(20),
        @LastName     nvarchar(20),
        @FullName     nvarchar(40),
        @DateHired    date,
        @EmplStatus   int,
        @IsMarried    bit,
        @WeeklyHours  decimal(6,2),
        @HourlySalary SmallMoney,
        @WeeklySalary SmallMoney;
SET @FirstName    = N'Samuel';
SET @LastName     = N'Weinberg';
SET @FullName     = @LastName + N', ' + @FirstName;
SET @DateHired    = N'12/05/1998';
SET @IsMarried    = 1;
SET @EmplStatus   = 2;
SET @WeeklyHours  = 36.50;
SET @HourlySalary = 15.72;
SET @WeeklySalary = @WeeklyHours * @HourlySalary;
SELECT @FullName As [Full Name],
       @DateHired AS [Date Hired],
       @EmplStatus AS [Empl Status],
       @IsMarried AS [Married?],
       @WeeklyHours AS Hours,
       @HourlySalary AS Hourly,
       @WeeklySalary AS Weekly;
GO

5. حال دستورات را اجرا نمایید.


آموزش SQL

ستونی با نوع داده ای Date

در صورتی که ستون را به صورت ویژوال ایجاد می کنید و می خواهید مقادیر تاریخ را در آن وارد کنید، بایستی گزینه ی date را از لیست کشویی Data Type انتخاب نمایید:


آموزش SQL

جهت ایجاد یک ستون با نوع داده ای ذکر شده از طریق کدنویسی، کافی است کلیدواژه ی DATE را پس از ستون درج نمایید.
کار را با پایگاه داده ی University خود ادامه می دهیم. دانشگاه دوره های آموزشی را در سه بخش از سال مدیریت می کند. هر بخش از سال یک ترم (semester) خوانده می شود که دقیقا مساوی با یک ترم 6 ماهه ی واقعی نیست و تنها سه ماه از سال به طول می انجامد. بدین معنی که برخلاف یک سال که دو ترم را شامل می شود، یک سال آموزشی دارای سه ترم سه ماهه می باشد: 1. ترم اول از اواسط ماه ژانویه آغاز شده و اواسط ماه مِی خاتمه می یابد.
2. ترم دوم از اواخر ماه می شروع شده و تقریبا اواخر ماه ژولیه به پایان می رسد.
3. ترم سوم از اواخر ماه آگوست شروع شده و تا اواسط ماه دسامبر ادامه دارد.
در این نسخه از پایگاه داده ها، University5، یک جدول ویژه ی سه ترم (semester) ایجاد می کنیم.


آموزش کاربردی: ایجاد ستون هایی از نوع Date

1. به منظور ایجاد یک پایگاه داده ی جدید، داخل Query Editor، مجموعه دستورات زیر را وارد نمایید:


USE master;
GO
DROP DATABASE University4;
GO
CREATE DATABASE University5;
GO
USE University5;
GO
CREATE SCHEMA Academics;
GO
CREATE SCHEMA Administration;
GO

2. برای اجرای دستور SQL، کلید F5 را بزنید.
3. در پنجره ی Object Explorer، بر روی Databases راست کلیک کرده و گزینه ی Refresh را انتخاب کنید.
4. اکنون گره University5 را باز نمایید.
5. جهت ایجاد یک جدول جدید، در Object Explorer بر روی Tables راست کلیک کرده و گزینه ی New Table... را انتخاب نمایید.
6. داخل پنجره ی Properties، بر روی Schema کلیک کرده و Academics را انتخاب نمایید.
7. ستون های این جدول را به صورت زیر ایجاد کنید:


Allow Nulls
Data Type
Coloumn Name
Unchecked
nvarchar(30)
Semester
Unchecked
date
SemesterStart
Unchecked
date
SemesterEnd
Unchecked
date
Session1Start
Unchecked
date
Session1End
Unchecked
date
Session2Start
Unchecked
date
Session2End
Unchecked
date
OnlineStart
Unchecked
date
OnlineEnd

8. جدول را ببندید.
9. زمانی که از شما پرسیده می شود آیا مایل به ذخیره ی جدول و اطلاعات آن هستید یا خیر، دکمه ی Yes را کلیک کنید.
10. اسم جدول را Semester انتخاب کنید.
11. دکمه ی OK را کلیک کنید.
12. در پنجره ی PowerShell، کد زیر را وارد کنید (در صورتی که PowerShell درست کار نمی کند یا در استفاده از آن با مشکل مواجه هستید، در Query Editor محیط SQL Server، کد زیر را وارد کنید):


CREATE DATABASE DepartmentStore1;
GO
USE DepartmentStore1;
GO
CREATE SCHEMA Inventory;
GO
CREATE TABLE Inventory.StoreItems
(
	ItemNumber int,
	DateEntered date,
	Manufacturer nvarchar(50),
	Category nvarchar(32),
	SubCategory nvarchar(40),
	ItemName nvarchar(80),
	ItemSize nvarchar(32),
	UnitPrice money,
	DiscountRate decimal(6, 2)
);
GO

درج اطلاعات در ستون های از نوع Date

مقادیری که به عنوان تاریخ در ستونی با نوع داده ای DATE وارد می شود، از فرمول های خاصی پیروی می کند. فرایند درج اطلاعات بسته به اینکه از طریق کد SQL و با کدنویسی صورت می گیرد یا به صورت ویژوال وارد ستون های جدول می شود، طبیعتا فرق خواهد کرد. چنانچه داده ها را به صورت ویزاردی (از طریق پنجرهTable ) وارد جدول می کنید، در آن صورت برای مشخص کردن مقدار فیلدی از نوع DATE، باید یکی از فرمول های فهرست شده در زیر را بکار ببرید:


MM-DD-YY
MM-DD-YYYY
MM/DD/YY
MM/DD/YYYY
DD-MMM-YY
DD-MMMM-YY
DD-MMM-YYYY
DD-MMMM-YYYY
YYYY-MM-DD

چنانچه داده ها را از طریق کدنویسی وارد جدول می کنید، یکی از فرمول های ذکر شده در بالا و یا فرمت زیر را بکار ببرید:


YYYYMMDD

مقداردهی ستون های از نوع DATE

  1. در Object Explorer، بر روی درایه ی Tables راست کلیک کرده و گزینه ی Refresh را انتخاب کنید.
  2. گره Tables را باز نمایید. حال بر روی Academics.Semesters راست کلیک کرده و گزینه ی Edit Top 200 Rows را انتخاب نمایید.
  3. در زیر سرستون Semester کلیک کرده و SPRING2012 را داخل کادر وارد نمایید. کلید Tab را فشار داده تا به کادر مجاور هدایت شوید.
  4. در زیر سرستون SemesterStart، مقدار 01-09-12 را طبق فرمت MM-DD-YY درج کنید.
  5. داخل کادر SemesterEnd، مقدار 04/29/12 را بر اساس فرمول MM/DD/YY وارد کنید.
  6. با زدن کلید Tab به فیلد مجاور رفته و مقدار 09-JAN-12 را بر اساس فرمت MM/DD/YY داخل آن تایپ کنید.
  7. به فیلد مجاور پیمایش نموده و مقدار 20120219 را بر اساس فرمول YYYYMMDD وارد آن کنید. حال Tab را فشار دهید. خواهید دید که یک پیام خطا به نمایش در می آید.
آموزش SQL

8. در کادر پیغام خطا، دکمه ی OK را را کلیک کنید.
9. رکورد را با مقادیر زیر تکمیل نمایید:


Semester: SPRING 2012
SemesterStart: 2012-01-09
SemesterEnd: 2012-04-29
Session1Start: 2012-01-09
Session1End: 19-FEBRUARY-12
Session2Start: 2/27/2012
Session2End: 29-APR-2012
OnlineStart: 9-January-12
OnlineEnd: 18-March-2012

10. جدول را ببندید.
11. در SQLQuery1، کد زیر را برای ایجاد تعدادی سطر جدید وارد نمایید:


USE University5;
GO
INSERT INTO Academics.Semesters(Semester, SemesterStart, SemesterEnd, Session1Start, Session1End, Session2Start, Session2End, OnlineStart, OnlineEnd)
VALUES(N'SUMMER 2012', N'05-14-12', N'08-19-2012', N'05/14/12', N'07/08/2012', N'16-JUL-12', N'19-JULY-2012', N'15-MAY-12', N'07-AUGUST-2012'),
      (N'FALL 2012',   N'20120917', N'20121216', N'20120920', N'20121014', N'20121022', N'20121216', N'20120920', N'20121014'),		
      (N'SPRING 2013', N'20130107', N'20130428', N'20130107', N'20130217', N'20130225', N'20130428', N'20130107', N'20130317'),
      (N'SUMMER 2013', N'20130513', N'20130818', N'20130513', N'20130707', N'20130715', N'20130818', N'20130513', N'20130707'),
      (N'FALL 2013',   N'20130916', N'20131215', N'20130919', N'20131013', N'20131021', N'20131215', N'20130919', N'20131013');
GO

12. برای اجرای کد، به منوی اصلی مراجعه کرده و سپس: Query -> Execute.
13. در پنجره ی Object Explorer، در زیر University5، بر روی Academics.Semesters راست کلیک کرده و گزینه ی Edit Top 200 Rows را انتخاب کنید.
14. در نوارابزار Query Designer، دکمه های آموزش SQL،آموزش SQLوآموزش SQLرا به ترتیب کلیک نمایید.

مرتب سازی فیلدهای از نوع Date

اگر رکوردهای جدول را بر اساس ستونی با نوع داده ای date مرتب سازی کنید و برخی از فیلدهای ستون دارای مقدار null باشند، ابتدا رکوردهای با مقدار null لیست می شوند، سپس مقادیر فیلدهای از نوع date به ترتیب زمانی مرتب سازی می شوند. اگر تنها مقادیر موجود در فیلدهای ستون از نوع date باشند، رکوردهایی که اول قرار گرفته اند، همان اول نمایش داده می شوند. اگر دو رکورد دارای مقدار یکسان باشند، رکوردی که اول ایجاد شده است، اول لیست می شود.


آموزش کاربردی: مرتب سازی فیلدهای با مقدار از نوع date

1. در پنجره ی Criteria، بر روی کادر Sort Type متعلق به فیلد SemesterStart کلیک کرده و گزینه ی Ascending را انتخاب نمایید.
2. داخل پنجره راست کلیک کرده گزینه ی Execute SQL را انتخاب نمایید.


آموزش SQL

3. بر روی تب مجاور (SQLQuery1.sql) کلیک کرده و با زدن کلیدهای Ctrl + A کلیه ی دستورات را انتخاب نمایید.
4. اکنون دستورات زیر را جایگزین کد جاری در این پنجره نمایید:


SELECT ALL sems.*
FROM Academics.Semesters sems
ORDER BY Session1Start;
GO

5. داخل پنجره راست کلیک کرده و گزینه ی Execute SQL را انتخاب نمایید.


آموزش SQL

فیلتر کردن ستون های از نوع Date

اگر بخاطر داشته باشید، زبان T-SQL از تمامی عملگرهای منطقی برای اجرای عملیات مقایسه پشتیبانی می کند. این عملیات را می توان بر روی مقادیر از نوع Date نیز اجرا کرد:
1. زمانی که از عملگر تساوی برای مقایسه ی دو مقدار از نوع dateاستفاده می کنید، مقادیر بایستی به یک روز مربوط باشند تا نتیجه ی عملیات true شود. در غیر این صورت نتیجه ی مقایسه false خواهد بود.
2. زمانی که عملیات مقایسه برای بررسی عدم برابری دو مقدار انجام می گیرد، مقادیر باید مربوط به روزهای مختلف باشند تا نتیجه true شود.
3. زمانی که دو مقدار از نوع date را برای سنجش کوچکتر و بزرگتری مقایسه می کنید، مقدار تاریخ اول باید مربوط به قبل یا بعد از مقدار تاریخ دوم باشد تا نتیجه ی عملیات true شود.
4. زمانی که دو مقدار از نوع date را برای سنجش کوچکتر/بزرگتری یا برابری مقایسه می کنید، مقدار تاریخ اول باید مربوط به قبل یا بعد از مقدار تاریخ دوم باشد و یا هر دو تاریخ مربوط به روز یکسان باشند تا نتیجه true شود.
5. می توان عملیات !> را بر روی دو مقدار از نوع date اجرا کرد. عملگر "<=" کاربردی مشابه !> دارد.
6. به همین نحو می توان عملگر !< را برای مقایسه دو مقدار از نوع date انجام داد. عملگر ذکر شده کاربردی مشابه >= دارد. همچنین می توان سایر عملگرها همچون BETWEEN یا IN، عطف و فصل منطقی (AND، OR) و ترکیبی از این دو برای مقادیر از نوع date بکار برد. علاوه بر موارد نام برده، می توان توابع درون ساخته را به همراه هر یک از عملگرها مورد استفاده قرار داد.


مثال:
SELECT FirstName, LastName, Gender, DateOfBirth, SingleParentHome
FROM   Registration.Students
WHERE  (DateOfBirth BETWEEN TRY_CONVERT(date, N'1995-01-01', 102) AND
			    TRY_CONVERT(date, N'1999-12-31', 102))

آموزش کاربردی: بررسی یک شرط

1. داخل Query Editor کلیک کرده و سپس با اعمال کلیدهای Ctrl + A تمام دستورات را انتخاب کنید.
2. حال کد زیر را جایگزین آن نمایید:


DECLARE @DateHired As date,
	@CurrentDate As date
SET @DateHired = N'1996/10/04'
SET @CurrentDate  = N'2007/04/11'
IF @DateHired < @CurrentDate
    PRINT N'You have the experience required for a new promotion in this job';
GO

3. به منظور اجرای دستور، کلید F5 را بزنید:


آموزش SQL

4. دستور موجود در Query Editor را به صورت زیر ویرایش نمایید:


DECLARE @DateHired As date,
	@CurrentDate As date
SET @DateHired = N'1996/10/04'
SET @CurrentDate  = N'2007/04/16'
IF @DateHired > @CurrentDate
	PRINT N'You have the necessary experience for a new promotion.'
GO

5. دستورات را با استفاده از کلید F5 اجرا نمایید:


آموزش SQL

مقادیر و توابع مربوط به نوع داده ای Date

SQL Server این اجازه را به شما می دهد که توابع اختصاصی خود را ایجاد نموده و در پایگاه داده بکار ببرید. با این حال، T-SQL خود توابع درون ساخته و پیش فرض متعددی فراهم می کند که پیش از تعریف و استفاده از تابع شخصی خود باید مورد بررسی قرار دهید. می توانید تابعی را فراخونی کنید که چندین آرگومان می گیرد، اما به هنگام استفاده و فراخوانی چنین تابعی لازم است اصول مربوط به ارسال آرگومان به آن تابع را (به خصوص در زمان صدا زدن آن تابع) به یاد داشته و رعایت نمایید.
همچنین می توان یک تابع را به همراه عملگرهایی که تاکنون آموختیم بکار ببریم و یا تابع توکار T-SQL را در یک عبارت استفاده کنیم.
برای اصلاح تجزیه و واکشی اطلاعات، می توان از توابع کاربر (توابع اختصاصی) بهره گرفت یا توابع درون ساخته ی T-SQL را مورد استفاده قرار داد. همان طور که بارها قبلا گفته شد، توصیه بر استفاده از توابع درون ساخته ی SQL می باشد.
به منظور استفاده از توابع توکار، کافی است در جایگاه اسم ستون، اسم تابع را ذکر نمایید و بلافاصله پس از آن کاراکتر پرانتز را درج کنید. در صورتی که تابع تعدادی پارامتر ورودی داشته باشد، اصول مربوط به فراخوانی چنین تابعی را رعایت نمایید.


تابع DATEFROMPARTS

روش های مختلفی برای ایجاد و نمایش مقدار Date وجود دارد. برای مثال مقدار04-08-01 نمایشگر چه تاریخی است؟ می تواند نشانگر تاریخ April 7, 2001 یاAugust 4, 2001 و یا August 1st, 2004 باشد. زبان T-SQL برای ایجاد مقداری از نوع Date (با فرمت روز، ماه و سال) تابعی به نام DATEFROMPARTS را ارائه می کند. نحوه ی نگارش آن به شرح زیر می باشد:


DATE DATEFROMPARTS(int year, int month, int day)

تابع نام برده در صورتی که سال، ماه و روز را به عنوان پارامتر به آن ارسال کنید، یک تاریخ برای شما ایجاد می کند.


آموزش کاربردی: تعریف مقادیر از نوع date و time

1. داخل Query Editor کلیک کرده و با زدن کلیدهای Ctrl + A به طور همزمان تمام دستورات را انتخاب نمایید.
2. برای استفاده از تابع DATEFROMPARTS() ، کد زیر را جایگزین کد جاری نمایید:


USE University5;
GO
INSERT INTO Academics.Semesters(Semester, SemesterStart, SemesterEnd,
				Session1Start, Session1End, Session2Start, Session2End, 
			        OnlineStart, OnlineEnd)
VALUES(N'SPRING 2014',
       DATEFROMPARTS(2014, 1, 6), DATEFROMPARTS(2014, 04, 27), DATEFROMPARTS(2014, 01, 06),
       N'20140216', N'20140224', N'20140427', N'20140106', N'20140323'),
      (N'SUMMER 2014',
       DATEFROMPARTS(2014, 5, 12), DATEFROMPARTS(2014, 08, 17), DATEFROMPARTS(2014, 05, 12),
       N'20140706', N'20140714', N'20140810', N'20140512', N'20140706'),
      (N'FALL 2014',   
       DATEFROMPARTS(2014, 09, 15), DATEFROMPARTS(2014, 12, 21),DATEFROMPARTS(2014, 09, 25), 
       N'20141013', N'20141020', N'20141221', N'20140925', N'20141013');
GO

3. برای اجرای دستور SQL، کلید F5را فشار دهید.
4. کد موجود در Query Editor را انتخاب کرده و دستور زیر را جایگزین آن نمایید:


SELECT sems.Semester,
       sems.SemesterStart,
       sems.SemesterEnd,
       sems.Session1Start,
       sems.Session1End,
       sems.Session2Start,
       sems.Session2End,
       sems.OnlineStart,
       sems.OnlineEnd
FROM Academics.Semesters sems
ORDER BY sems.SemesterStart;
GO

5. داخل پنجره راست کلیک کرده و گزینه ی Execute SQL را انتخاب نمایید.


تاریخ جاری سیستم

برای بدست آوردن تاریخ و زمان جاری رایانه مورد استفاده، T-SQL تابع GETDATE را تعبیه کرده و در اختیار کاربر قرار می دهد:


GETDATE();

برای بدست آوردن مقدار تاریخ با دقت بیشتر، می توان تابع SYSDATETIME را فراخوانی کرد.



SYSDATETIME();

تصور کنید پایگاه داده ای به نام AutoRepairShop در دست دارید و این پایگاه داده یک جدول دارد که در آن اطلاعات مربوط به سفارش های تعمیر مشتریان در آن ذخیره می شود:



CREATE TABLE RepairOrders
(
  ReceiptNumber int,
  CustomerName varchar(50),
  CustomerPhone varchar(20),
  RepairDate datetime2
);
GO

به هنگام درج داده در این جدول، می توانید به کاربر اجازه دهید اسم مشتری و شماره ی تلفن آن را وارد کند و تاریخ جاری را خود با فراخوانی تابع SYSDATETIME() یاGETDATE() وارد نمایید.


مثال:
INSERT INTO RepairOrders(ReceiptNumber, CustomerName, CustomerPhone, RepairDate)
	    VALUES(100001, N'Annette Berceau', N'301-988-4615', SYSDATETIME());
GO
INSERT INTO RepairOrders(ReceiptNumber, CustomerPhone, CustomerName, RepairDate)
	    VALUES(100002, N'(240) 601-3795', N'Paulino Santiago', SYSDATETIME());
GO
INSERT INTO RepairOrders(ReceiptNumber, CustomerName, RepairDate, CustomerPhone)
	    VALUES(100003, N'Alicia Katts', SYSDATETIME(), N'(301) 527-3095');
GO
INSERT INTO RepairOrders(ReceiptNumber, RepairDate, CustomerPhone, CustomerName)
	    VALUES(100004, SYSDATETIME(), N'703-927-4002', N'Bertrand Nguyen');
GO

تبدیل رشته به تاریخ

در مباحث اولیه ی آموزش SQL Server آموختیم که زبان T-SQL دو تابع TRY_PARSE() و TRY_CONVERT() را برای تبدیل مقدار از نوع به نوع داده ای دیگر فراهم می کند. این توابع یک رشته به عنوان آرگومان گرفته و آن را پویش می کند. اگر تابع بتواند مقدار را تبدیل کند، آن را به عنوان خروجی برمی گرداند اما اگر در تبدیل موفق نبود مقدار NULL را برمی گرداند.


مثال:
  SELECT FirstName, LastName, Gender, DateOfBirth, SingleParentHome
FROM   Registration.Students
WHERE  (DateOfBirth BETWEEN TRY_CONVERT(date, N'1995-01-01', 102) AND
			    TRY_CONVERT(date, N'1999-12-31', 102))

فرمت و کنترل نمایش تاریخ

تابع FORMAT() چگونگی نمایش یک فیلد را مشخص می کند. نحوه ی استفاده از این تابع به صورت زیر می باشد:


FORMAT(value, nvarchar format [, culture ] ) RETURNS nvarchar

این تابع دو آرگومان الزامی و یک آرگومان اختیاری می گیرد. برای فرمت دهی مقدار فیلدی از نوع date، در جایگاه پارامتر اول مقدار date (فیلدی که می خواهیم قالب بندی کنیم) را درج می کنیم. آرگومان دوم فرمتی که مقدار اول باید به آن صورت نمایش داده شود را مشخص می کند. مقدار تاریخ از چندین بخش تشکیل شده است که توسط تفکیک گرهایی نظیر نقطه و ویرگول از هم جدا می شوند.


نمایش مقدار روز در قالب عدد

روز های ماه از 1 تا 31 شماره گذاری می شوند. یکی از راه های نمایش مقدار روز استفاده از آرگومان dd (حروف کوچک) می باشد:
1. یک روش برای نمایش مقدار روز ارسال پارامتر d همراه با m و y می باشد. اگر مقدار روز بین 0 تا 9 (بدون صفر آغازین) باشد، d آن را به صورت یک عدد نمایش می دهد.
2. اگر پارامتر به تنهایی یا در قالب یک عبارت که ماه و سال را نیز شامل می شود، ارسال گردد، در هر صورت dd روز را به صورت دو رقم نمایش می دهد. اگر آن روز بین 1 تا 9 باشد، در آن صورت با صفر آغازین نمایش داده می شود.


مثال:
DECLARE @DateValue DATE,
        @StrValue nvarchar(50);
SET @DateValue = N'20120604';
SET @StrValue = FORMAT(@DateValue, N'dd');
SELECT @DateValue AS Original;
SELECT @StrValue AS Formatted;
GO

نتیجه ی زیر را برمی گرداند:
آموزش SQL

نمایش اسم روزهای هفته به عنوان خروجی

اسم روزهای هفته یا به طور کامل نوشته می شوند و یا تنها سه حرف اول آن ها نمایش داده می شود. برای این که اسم روز هفته به صورت سه حرف در خروجی نمایش داده شود، بایستی فرمت "ddd" را به عنوان آرگومان به تابع FORMAT() ارسال نمایید. اسم روزهای هفته بر اساس این فرمت به ترتیب Sun، Mon، Tue، Wed، Thu، Fri یا Sat می باشند.


مثال:
DECLARE @DateValue DATE,
@StrValue nvarchar(50);
SET @DateValue = N'20120604';
SET @StrValue = FORMAT(@DateValue, N'ddd');
SELECT @DateValue AS Original;
SELECT @StrValue AS Formatted;
GO

نتیجه ی زیر را برمی گرداند:
آموزش SQL

برای اینکه نام هفته به صورت کامل نمایش داده شود، می بایست فرمت "dddd" را به عنوان آرگومان به تابع FORMAT() ارسال کنید.


مثال:
 DECLARE @DateValue DATE,
        @StrValue nvarchar(50);
SET @DateValue = N'20120604';
SET @StrValue = FORMAT(@DateValue, N'dddd');
SELECT @DateValue AS Original;
SELECT @StrValue AS Formatted;
GO

نتیجه ی زیر را برمی گرداند:
آموزش SQL

جهت نمایش اسم روز هفته و روز ماه به صورت عدد، می توان فرمت ترکیبی ایجاد نمود (N'ddd dd') و آن را به عنوان آرگومان به تابع ارسال کرد. در زمان ایجاد چنین رشته ای، ثابت ها باید داخل آن به وسیله ی تفکیک گر از هم جدا شده تا مترجم (compiler) بداند کدام فرمت ها و کجا بایستی اعمال شوند. برای جداسازی فرمت ها می توان هر کاراکتری را بکار برد. این کاراکتر را می بایست در regional setting تنظیم کرد.


مثال:
DECLARE @DateValue DATE,
        @StrValue nvarchar(50);
SET @DateValue = N'20120604';
SET @StrValue = FORMAT(@DateValue, N'ddd dd');
SELECT @DateValue AS Original;
SELECT @StrValue AS Formatted;
GO

نتیجه:
آموزش SQL

آموزش کاربردی: نمایش روزهای هفته

1. کد موجود در Query Editor را به صورت زیر ویرایش نمایید:


SELECT sems.Semester,
       FORMAT(sems.SemesterStart, N'dddd') "Semester starts on",
       sems.SemesterStart, 
       sems.SemesterEnd, 
       FORMAT(sems.SemesterEnd, N'dddd') "Semester ends on",
       sems.Session1Start, sems.Session1End, sems.Session2Start, 
       sems.Session2End, sems.OnlineStart, sems.OnlineEnd
FROM Academics.Semesters sems
ORDER BY sems.SemesterStart;
GO

2. داخل پنجره راست کلیک کرده و گزینه ی Execute SQL را انتخاب نمایید.


نمایش روزهای ماه به صورت عدد

ماه ها به دو طریق نمایش داده می شوند: یا در قالب یک اسم و یا به صورت عدد. ماه های سال بدین طریق شماره گذاری می شوند: 1=January, 2=February, 3=March, 4=April, 5=May, 6=June, 7=July, 8=August, 9=September, 10=October, 11=November و 12=December.
برای نمایش ماه دلخواه به صورت عدد، فرمت MM (حروف بزرگ) را به عنوان آرگومان به تابع FORMAT() پاس دهید. ماه در قالب عدد صحیح و با دو رقم نمایش داده می شود. اگر عدد بین 1 تا 9 باشد، در آن صورت با یک 0 آغازین نمایش داده می شود.


مثال:
DECLARE @DateValue DATE,
        @StrValue nvarchar(50);
SET @DateValue = N'20120604';
SET @StrValue = FORMAT(@DateValue, N'MM');
SELECT @DateValue AS Original;
SELECT @StrValue AS Formatted;
GO

نتیجه ی زیر را بدست می دهد:
آموزش SQL

اگر می خواهید همراه با شماره ی ماه مورد نظر شماره ی روز نیز نمایش داده شود، در آن صورت باید حرف d را نیز همراه با M به عنوان پارامتر به تابع مذکور ارسال کنید. تفاوت زیر قابل مشاهده می باشد:
1. M (بزرگ) مقدار شماره ی ماه را بدون لحاظ کردن 0 آغازین نمایش می دهد.


مثال:
DECLARE @DateValue DATE,
        @StrValue nvarchar(50);
SET @DateValue = N'20120604';
SET @StrValue = FORMAT(@DateValue, N'd-M');
SELECT @DateValue AS Original;
SELECT @StrValue AS Formatted;
GO

نتیجه ی زیر حاصل می گردد:
آموزش SQL

2. پارامتر ورودی MM شماره ی ماه را با دو رقم نمایش می دهد. همان طور که قبلا گفته شد اگر عدد بین 1 تا 9 باشد، یک صفر آغازین به اول آن اضافه می شود.
با پیروی از اصول مربوط به نمایش ترکیبی از اسم روز هفته و شماره ی روز ماه، می توان شماره ی روز و شماره ی ماه را به عنوان خروجی تولید کرد. اما این بار بجای خط فاصله، از کاراکار ویژه برای تفکیک آرگومان ها استفاده می کنیم (برای اینکه مشخص شود ترکیب دو مقدار شماره ی ماه و روز به عنوان خروجی نمایش داده می شود). در انگلیسی آمریکایی "/" به عنوان کاراکتر پیش فرض تنظیم شده است. می توان برای تنظیم کاراکتر تفکیک گر به regional setting کامپیوتر مراجعه کرد.


مثال:
DECLARE @DateValue DATE,
        @StrValue nvarchar(50);
SET @DateValue = N'20121004';
SET @StrValue = FORMAT(@DateValue, N'M/dd');
SELECT @DateValue AS Original;
SELECT @StrValue AS Formatted;
GO

می توان اسم روز هفته را همراه با مقدار روز/ماه یا ماه/روز نمایش داد:


DECLARE @DateValue DATE,
        @StrValue nvarchar(50);
SET @DateValue = N'20121004';
SET @StrValue = FORMAT(@DateValue, N'ddd M/dd');
SELECT @DateValue AS Original;
SELECT @StrValue AS Formatted;
GO

می توان این فرمت را برای نمایش تاریخ به صورت ترکیبی (متشکل از اسم روز هفته به صورت کامل، شماره ی ماه و شماره ی روز) بکار برد:


DECLARE @DateValue DATE,
        @StrValue nvarchar(50);
SET @DateValue = N'20121004';
SET @StrValue = FORMAT(@DateValue, N'dddd dd-MM');
SELECT @DateValue AS Original;
SELECT @StrValue AS Formatted;
GO

نمایش اسم ماه به عنوان خروجی

می توان مقدار ماه را به دو طریق نمایش داد: اسم ماه دلخواه به صورت کامل و یا سه حرف اول اسم آن. برای این منظور کافی است فرمت MMM را به عنوان آرگومان به تابع FORAMT() ارسال نمایید.


مثال:
DECLARE @DateValue DATE,
        @StrValue nvarchar(50);
SET @DateValue = N'20120604';
SET @StrValue = FORMAT(@DateValue, N'MMM');
SELECT @DateValue AS Original;
SELECT @StrValue AS Formatted;
GO

می توان این پارامتر را در ترکیبی گنجاند و به عنوان آن پارامتر پاس داد که علاه بر اسم ماه، اسم هفته و شماره ی ماه را نیز نمایش دهد:


DECLARE @DateValue DATE,
        @StrValue nvarchar(50);
SET @DateValue = N'20120604';
SET @StrValue = FORMAT(@DateValue, N'dddd, dd-MMM');
SELECT @DateValue AS Original;
SELECT @StrValue AS Formatted;
GO

نتیجه ی زیر حاصل می گردد:
آموزش SQL

برای نمایش اسم ماه به صورت کامل، بایستی پارامتر MMMM را به تابع FORAMT() ارسال کنید.


مثال:
DECLARE @DateValue DATE,
        @StrValue nvarchar(50);
SET @DateValue = N'20121004';
SET @StrValue = FORMAT(@DateValue, N'dddd, d MMMM');
SELECT @DateValue AS Original;
SELECT @StrValue AS Formatted;
GO

آموزش کاربردی: نمایش ماه در خروجی

1. کد موجود در Query Editor را به صورت زیر ویرایش کنید:


SELECT sems.Semester,
       FORMAT(sems.SemesterStart, N'MMMM') "Semester spans from",
       FORMAT(sems.SemesterEnd, N'MMMM') "Semester spans to",
       FORMAT(sems.SemesterStart, N'dddd') "Semester starts on",
       sems.SemesterStart, 
       sems.SemesterEnd, 
       FORMAT(sems.SemesterEnd, N'dddd') "Semester ends on",
       sems.Session1Start, sems.Session1End, sems.Session2Start, 
       sems.Session2End, sems.OnlineStart, sems.OnlineEnd
FROM Academics.Semesters sems
ORDER BY sems.SemesterStart;
GO

2. داخل پنجره راست کلیک کرده و گزینه ی Execute SQL را برای اجرای دستورات و مشاهده ی نتیجه انتخاب کنید.


نمایش مقدار سال در خروجی

اگر می خواهید مقدار سال را به صورت دو رقم نمایش داده شود، کافی است فرمت yy (حروف کوچک) را به عنوان پارامتر ارسال کنید. در این مثال، دو رقم آخر شماره ی سال در خروجی نمایش داده می شود:


DECLARE @DateValue DATE,
        @StrValue nvarchar(50);
SET @DateValue = N'20060604';
SET @StrValue = FORMAT(@DateValue, N'yy');
SELECT @DateValue AS Original;
SELECT @StrValue AS Formatted;
GO

نتیجه:
آموزش SQL

برای نمایش مقدار شماره ی سال با چهار رقم، می بایست پارامتر yyy یا yyyy را به تابع FORMAT() ارسال کنید.
می توان مقدار یک تاریخ را به صورت کامل نمایش داد (اسم روز هفته و ماه به صورت کوتاه همراه با دو رقم آخر شماره ی سال):


DECLARE @DateValue DATE,
        @StrValue nvarchar(50);
SET @DateValue = N'20121004';
SET @StrValue = FORMAT(@DateValue, N'ddd dd MMM yy');
SELECT @DateValue AS Original;
SELECT @StrValue AS Formatted;
GO

نتیجه ی زیر را بدست می دهد:
آموزش SQL

در زیر مثالی را مشاهده می کنید که اسم کامل روز هفته و ماه را نمایش می دهد:


DECLARE @DateValue DATE,
        @StrValue nvarchar(50);
SET @DateValue = N'20121004';
SET @StrValue = FORMAT(@DateValue, N'dddd d MMMM yy');
SELECT @DateValue AS Original;
SELECT @StrValue AS Formatted;
GO

برای نمایش مقدار شماره ی سال با چهار رقم، می بایست فرمت yyy و yyyy را به عنوان پارامتر به تابع ارسال کرد:

DECLARE @DateValue DATE,
        @StrValue nvarchar(50);
SET @DateValue = N'20121004';
SET @StrValue = FORMAT(@DateValue, N'yyy');
SELECT @DateValue AS Original;
SELECT @StrValue AS Formatted;
GO

حال با بهره گیری از آموخته های خود، اسم روز هفته، ماه را به صورت کامل و به همراه شماره سال با چهار رقم و در نهایت شماره ی روز ماه را با دو رقم نمایش می دهیم:


DECLARE @DateValue DATE,
        @StrValue nvarchar(50);
SET @DateValue = N'20121004';
SET @StrValue = FORMAT(@DateValue, N'dddd, MMMM dd, yyyy');
SELECT @DateValue AS Original;
SELECT @StrValue AS Formatted;
GO

آموزش SQL

آموزش کاربردی: نمایش مقدار سال از یک تاریخ مشخص

1. دستور موجود در پنجره ی Query Editor را به صورت زیر ویرایش کنید:


SELECT sems.Semester,
       FORMAT(sems.SemesterStart, N'yyyy') Year,
       FORMAT(sems.SemesterStart, N'MMMM') "Semester spans from",
       FORMAT(sems.SemesterEnd, N'MMMM') "Semester spans to",
       FORMAT(sems.SemesterStart, N'dddd') "Semester starts on",
       sems.SemesterStart, 
       sems.SemesterEnd,
       sems.Session1Start, sems.Session1End, sems.Session2Start, 
       sems.Session2End, sems.OnlineStart, sems.OnlineEnd
FROM Academics.Semesters sems
ORDER BY sems.SemesterStart;
GO

2. داخل پنجره راست کلیک کرده و گزینه ی Execute SQL را برای اجرای دستورات انتخاب نمایید.


فرمت نمایش ماه و سال

می توان فرمت M یا m را به عنوان پارامتر ورودی به تابع FORMAT() پاس داد. در این صورت، تابع یاد شده اسم ماه را به صورت کامل به همراه شماره ی ماه با دو رقم به عنوان خروجی برمی گرداند:


DECLARE @DateValue DATE,
        @StrValue nvarchar(50);
SET @DateValue = N'20060604';
SET @StrValue = FORMAT(@DateValue, N'm');
SELECT @DateValue AS Original;
SELECT @StrValue AS Formatted;
GO

نتیجه ی زیر را بدست می دهد:
آموزش SQL

همچنین می توان y یا Y را به عنوان پارامتر ارسال کرد. تابع با دریافت این آرگومان، اسم کامل ماه، ویرگول و شماره ی سال را با چهار رقم به عنوان خروجی برمی گرداند:


DECLARE @DateValue DATE,
        @StrValue nvarchar(50);
SET @DateValue = N'20121004';
SET @StrValue = FORMAT(@DateValue, N'y');
SELECT @DateValue AS Original;
SELECT @StrValue AS Formatted;
GO

نتیجه ی زیر را تولید می کند:
آموزش SQL

روش و فرمت استاندارد نمایش تاریخ

فرمت استاندارد و متعارف نمایش مقدار تاریخ، short format خوانده می شود. برای تنظیم آن باید: Control Panel -> Regional and Language Options -> Date property -> Short Date.


آموزش SQL

برای نمایش مقدار فیلدی از نوع date با فرمت کوتاه، بایستی d را به عنوان آرگومان دوم به تابع FORMAT ارسال نمایید. در انگلیسی آمریکایی فرمت کوتاه نمایش تاریخ، M/d/yyyy می باشد. با استفاده از این فرمت ماه به صورت عدد نمایش داده می شود. اگر ماه و روز مقداری بین 0 تا 9 را شامل شوند، در آن صورت هیچ صفر آغازینی نمایش داده نمی شود.


مثال:
DECLARE @DateValue DATE,
        @StrValue nvarchar(50);
SET @DateValue = N'20060604';
SET @StrValue = FORMAT(@DateValue, N'd');
SELECT @DateValue AS Original;
SELECT @StrValue AS Formatted;
GO

خروجی:
آموزش SQL

اگر فرمت d همراه با m و y به عنوان آرگومان به تابع فرستاده شوند، در آن صورت روز با عدد 1 (برای روزهایی که از 1 تا 9 هستند) یا 2 (برای روزهای 1 تا 12) ارائه می شود.
می توان بجای d، فرمت G را به عنوان آرگومان ارسال کرد:
1. در صورتی که G به تنهایی ارسال شود، تابع FORMAT() مقدار تاریخ را با فرمت تنظیم شده در short date به همراه 12:00:00 AMنمایش می دهد.
2. G را نباید با فرمت های دیگر به تابع ارسال کرد.
همچنین می توان g (حرف کوچک) را به عنوان آرگومان به تابع مزبور ارسال کرد:
1. اگر g به تنهایی ارسال شود، تابع FORMAT() مقدار تاریخ را با فرمت تنظیم شده در short date به همراه 12:00:00 AMنمایش می دهد. 2. اگر با حروف و علامت های دیگر به عنوان پارامتر پاس داده شود، در آن صورت g مقدار A.D را همراه با مقدار تاریخ نمایش می دهد.


فرمت Long Date

روش دیگر برای که برای نمایش مقدار date بکار می رود، فرمت long date می باشد. برای تنظیم آن: Customize Regional Options -> Date property -> Long Date. برای نمایش مقدار فیلدی از نوع date با فرمت ذکر شده، لازم است D را به عنوان آرگومان به تابع FORMAT() ارسال کنید. در انگلیسی آمریکایی فرمت short date بدین صورت می باشد: dddd, MMMM dd, yyyy. اسم روز هفته و ماه به صورت کامل نمایش داده می شود. در صورتی که مقدار روز بین 1 تا 9 باشد، با یک 0 آغازین نمایش داده می شود.


مثال:
DECLARE @DateValue DATE,
        @StrValue nvarchar(50);
SET @DateValue = N'20060604';
SET @StrValue = FORMAT(@DateValue, N'D');
SELECT @DateValue AS Original;
SELECT @StrValue AS Formatted;
GO

نتیجه ی زیر را بدست می دهد:
آموزش SQL

توجه داشته باشید که D را باید به تنهایی به عنوان آرگومان ارسال کنید.
به عنوان جایگزین برای پارامتر ذکر شده، می توان f را به تابع پاس داد. اگر f را به تنهایی به عنوان آرگومان ارسال کنید، تابع مقدار تاریخ را با فرمت long date، به همراه مقدار 12:00 AM برمی گرداند. سپس آن را با دستور SELECT از جدول کوئری می گیریم.


DECLARE @DateValue DATE,
        @StrValue nvarchar(50);
SET @DateValue = N'20060604';
SET @StrValue = FORMAT(@DateValue, N'f');
SELECT @DateValue AS Original;
SELECT @StrValue AS Formatted;
GO

نتیجه:
آموزش SQL


لازم به ذکر است که f را نیز نباید همراه با حروف و علامت های دیگر به عنوان آرگومان ارسال کرد. بجای آن می توان F (حرف بزرگ) را به عنوان پارامتر به تابع FORMAT() پاس داد:
1. اگر F را به تنهایی پاس دهید، تابع مقدار تاریخ را با فرمت long date به همراه مقدار 12:00:00 AM در خروجی برمی گرداند.
2. F نباید همراه با علامت یا حرف دیگری به تابع ارسال گردد.


آموزش کاربردی

1. دستورات موجود در Query Editor را به صورت زیر ویرایش کنید:


SELECT sems.Semester,
       FORMAT(sems.SemesterStart, N'yyyy') Year,
       FORMAT(sems.SemesterStart, N'MMMM') "Semester spans from",
       FORMAT(sems.SemesterEnd, N'MMMM') "Semester spans to",
       FORMAT(sems.SemesterStart, N'D') "Start of Semester",
       FORMAT(sems.SemesterEnd, N'D') "End of Semester",
       FORMAT(sems.Session1Start, N'D') "Start of Session 1", 
       FORMAT(sems.Session1End, N'D') "End of Session 1", 
       FORMAT(sems.Session2Start, N'D') "Start of Session 2", 
       FORMAT(sems.Session2End, N'D') "End of Session 2", 
       FORMAT(sems.OnlineStart, N'D') "End of Online Sessions"
FROM Academics.Semesters sems
ORDER BY sems.SemesterStart;
GO

2. اکنون Ctrl + A را گرفته و دکمه ی Execute را در نوارابزار کلیک کنید تا مجموعه دستورات اجرا گردد.


اجرای عملیات مختلف بر روی مقادیر Date با توابع:

تابع DATEADD

می توان با استفاده از تابع DATEADD تعدادی روز، ماه یا حتی سال به مقدار تاریخ (فیلدی از نوع Date) افزود. نحوه ی استفاده از آن به صورت زیر می باشد:


DATEADD(TypeOfValue, ValueToAdd, DateOrTimeReferenced)

آرگومان اول نوع مقداری که باید به آن اضافه شود (دستکاری شود) را مشخص می کند که می تواند یکی از موارد زیر باشد (به سال اضاف شود یا به ماه و یا به روز):


شرح TypeOfValue
تعدادی سال به مقدار تاریخ افزوده می شود. yyyy yy Year
تعدادی یک چهارم سال (تعدادی سه ماه) به مقدار تاریخ اضافه می شود. qq q quarter
تعدادی ماه به مقدار تاریخ افزوده می شود. mm m Month
تعدادی روز از یک سال به مقدار تاریخ اضافه می کند. dy y dayofyear
تعدادی روز به مقدار تاریخ اضافه می کند. dd d Day
تعدادی هفته به مقدار تاریخ اضافه می کند. ww wk Week

دومین آرگومان یک عدد صحیح ثابت است که مقداری که باید به آرگومان اول اضافه شود را مشخص می کند. آرگومان سوم مقدار اولیه ای است که عملیات بر روی آن انجام می شود. مثال زیر تعدادی سال به مقدار تاریخ اضافه می کند:


DECLARE @Original date,
	@Result date;
SET     @Original = N'20121204';
SET     @Result = DATEADD(yy, 2, @Original);
SELECT @Original [Original Date];
SELECT @Result [2 Years Later];
GO

نتیجه ی زیر را بدست می دهد:
آموزش SQL
نمونه کد زیر 6 ماه به مقدار تاریخ اضافه می کند:
DECLARE @Original date,
	@Result date;
SET     @Original = N'20121204';
SET     @Result = DATEADD(Quarter, 2, @Original);
SELECT @Original [Original Date];
SELECT @Result [2 Years Later];
GO

نتیجه ی زیر را بازمی گرداند:
آموزش SQL

مثال زیر 5 ماه به مقدار تاریخ اضافه می کند:


DECLARE @Original date,
	@Result date;
SET     @Original = N'20121004';
SET     @Result = DATEADD(m, 5, @Original);
SELECT @Original [Original Date];
SELECT @Result [2 Years Later];
GO

نتیجه ی زیر حاصل می گردد:
آموزش SQL

آموزش کاربردی

1. داخل Query Editor کلیدهای Ctrl + A را گرفته تا تمامی دستورها انتخاب شوند و سپس دستور زیر را جایگزین آن نمایید:


/* Instead of specifying a deterministic date of birth, we will supply 
   a number of days to this function and, based on day this script is 
   run, the function will subtract the number of days from that date.
   That's how we will get the date of birth of a student. */
CREATE FUNCTION Administration.SetDateOfBirth(@days int)
RETURNS Date
AS
BEGIN
	RETURN DATEADD(d, @days, SYSDATETIME());
END
GO
CREATE TABLE Academics.UndergraduateStudents
(
    StudentNumber nvarchar(8) not null,
    FirstName nvarchar(20),
    MiddleName nvarchar(20),
    LastName nvarchar(20),
    BirthDate date,
    Gender nvarchar(5) default N'N/A'
);
GO
INSERT INTO Academics.UndergraduateStudents(StudentNumber, FirstName, MiddleName, LastName, BirthDate, Gender)
VALUES(N'88130480', N'Marie', N'Annette', N'Robinson', Administration.SetDateOfBirth(-6817), N'F'),
      (N'24795711', N'Roger', N'Dermot',  N'Baker',    Administration.SetDateOfBirth(-6570), N'M');
GO
INSERT INTO Academics.UndergraduateStudents(StudentNumber, FirstName, LastName, BirthDate, Gender)
VALUES(N'18073572', N'Patrick', N'Wisne', Administration.SetDateOfBirth(-11012), N'M');
GO
INSERT INTO Academics.UndergraduateStudents(StudentNumber, FirstName, LastName, BirthDate)
VALUES(N'94759284', N'Chris', N'Harpers', Administration.SetDateOfBirth(-10570));
GO
INSERT INTO Academics.UndergraduateStudents(StudentNumber, FirstName, MiddleName, LastName, BirthDate, Gender)
VALUES(N'22803048', N'Gary', N'Jonathan', N'Jones', Administration.SetDateOfBirth(-19926), N'M'),
      (N'97394285', N'Jessica', N'Danielle', N'Weisburgh', Administration.SetDateOfBirth(-12081), N'F'),
      (N'97596002', N'Laurent', N'Frank', N'Simonson', Administration.SetDateOfBirth(-17503), N'M'),
      (N'94708257', N'Christopher', N'Sheldon', N'Dale', Administration.SetDateOfBirth(-6570),  N'M'),
      (N'48009520', N'Diane', N'Kathy', N'Paglia', Administration.SetDateOfBirth(-13840), N'F'),
      (N'13048039', N'Joseph', N'Christian', N'Riback', Administration.SetDateOfBirth(-7909),  N'M'),
      (N'92270397', N'Patrick', N'Jonathan', N'Brzeniak', Administration.SetDateOfBirth(-17361), N'M');
GO
INSERT INTO Academics.UndergraduateStudents(StudentNumber, FirstName, LastName, BirthDate, Gender)
VALUES(N'70840584', N'Tracy', N'Sikorowski', Administration.SetDateOfBirth(-11650), N'M');
GO

2. حال کد جاری را با راست کلیک داخل پنجره و انتخاب گزینه ی Execute SQL، اجرا کنید.


تابع DATEDIFF()

برای بدست آوردن اختلاف بین دو سال، می توان تابع DATEDIFF() را فراخوانی کرد. نحوه ی استفاده از آن به صورت زیر می باشد:


DATEDIFF(TypeOfValue, StartDate, EndDate)

اولین آرگومان نوع مقدار که تابع باید برگرداند را مشخص می کند (برای مثال سال را برگرداند، ماه و یا روز را). آرگومان دوم تاریخ آغاز و آرگومان سوم تاریخ پایان را مشخص می کند.
مثال زیر تعداد سال هایی که از زمان استخدام یک کارکن تا تاریخ جاری می گذارد را محاسبه می کند.


DECLARE @DateHired As date,
        @CurrentDate As date;
SET @DateHired = N'2005/10/04';
SET @CurrentDate  = N'20130622';
SELECT DATEDIFF(Year, @DateHired, @CurrentDate)
       AS [Current Experience];
GO

مقدار زیر را برمی گرداند:
آموزش SQL

تابع IIF()

جدول زیر را درنظر داشته باشید:
USE master
GO
IF  EXISTS (
	SELECT name 
		FROM sys.databases 
		WHERE name = N'PublicLibrary1'
)
DROP DATABASE PublicLibrary1
GO
CREATE DATABASE PublicLibrary1
GO
USE PublicLibrary1;
GO
CREATE SCHEMA Administration;
GO
CREATE TABLE Administration.Members
(
    MemberNumber nchar(11),
    FirstName nvarchar(25),
    LastName nvarchar(25),
    Gender int,
    DateOfBirth date
);
GO
INSERT INTO Administration.Members
VALUES(N'93757-49411', N'Joshua', N'Ransome', 1, N'20020412');
GO
INSERT INTO Administration.Members(MemberNumber, FirstName, LastName, Gender)
VALUES(N'20304-70592', N'Chris', N'Drews', 3);
GO
INSERT INTO Administration.Members
VALUES(N'13594-60857', N'Ephraim', N'Chance', 1, N'19440824'),
	  (N'29283-47597', N'Jeannette', N'Gong', 2, N'19781104');
GO
INSERT INTO Administration.Members(MemberNumber, FirstName, LastName, DateOfBirth)
VALUES(N'39485-00741', N'Bobbie', N'Womack', N'19840602');
GO
INSERT INTO Administration.Members(MemberNumber, FirstName,
		LastName, Gender, DateOfBirth)
VALUES(N'83758-30737', N'Mathilda', N'Bambeck', 2, N'19940816');
GO

لیستی از رکوردها را در زیر مشاهده می کنید:


USE PublicLibrary1;
GO
SELECT mbrs.MemberNumber [Mbr #],
       mbrs.FirstName [First Name],
       mbrs.LastName [Last Name],
       mbrs.Gender,
       mbrs.DateOfBirth [Date of Birth],
       DATEDIFF(Year, mbrs.DateOfBirth, SYSDATETIME()) Age
FROM Administration.Members mbrs;
GO

نتیجه ی زیر حاصل می گردد:
آموزش SQL

تابع IFF() بر اساس نتیجه ی یک شرط، کار یا عمل خاصی را انجام می دهد. به عبارتی دیگر دستور IFF یک دستور شرطی است که در صورت درست بودن شرط موجود در قسمت اول تابع عبارت دوم را اجرا می کند و در غیر این صورت دستورات موجود در قست سوم تابع را اجرا می نماید.


IIF(Conditional Expression, What To Do If True, What To Do If False) RETURNS sql_variant;

این تابع سه آرگومان می گیرد. اولین آرگومان یک دستور شرطی است که در آن عملگرهای منطقی که تاکنون آموزش داده شده بکار می رود. اگر شرط مشخص شده در آرگومان اول درست بود، آرگومان دوم برگردانده می شود و در صورت غلط بودن شرط، تابع آرگومان دوم را نادیده گرفته و آرگومان سوم را برمی گرداند.
مثالی از فراخوانی تابع IFF() را در زیر مشاهده می کنید:


SELECT mbrs.MemberNumber [Mbr #],
       mbrs.FirstName [First Name],
       mbrs.LastName [Last Name],
       mbrs.Gender,
       mbrs.DateOfBirth [Date of Birth],
       DATEDIFF(Year, mbrs.DateOfBirth, SYSDATETIME()) Age,
       IIF(DATEDIFF(Year, DateOfBirth, SYSDATETIME()) <= 18, N'Teen', N'Adult') "Membership Category"
FROM Administration.Members mbrs;
GO

خروجی:
آموزش SQL

می توان یک تابع IFF() را در تابع IFF() دیگر گنجاند (Nest کرد).


مثال:
USE PublicLibrary1;
GO
SELECT mbrs.MemberNumber [Mbr #],
       mbrs.FirstName [First Name],
       mbrs.LastName [Last Name],
  IIF(mbrs.Gender = 1, N'Male', IIF(mbrs.Gender = 2, N'Female', N'Unknown')) Gender,
       mbrs.DateOfBirth [Date of Birth],
       DATEDIFF(Year, mbrs.DateOfBirth, SYSDATETIME()) Age,
       IIF(DATEDIFF(Year, DateOfBirth, SYSDATETIME()) <= 18, 
	   N'Teen',
	   IIF(DATEDIFF(Year, DateOfBirth, SYSDATETIME()) <= 65, 
	       N'Adult',
               N'Senior')) "Membership Category"
FROM Administration.Members mbrs;
GO

نتیجه:
آموزش SQL

آموزش کاربردی: محاسبه ی اختلاف در مقادیر تاریخ

1. تمامی دستورات موجود در Query Editor را انتخاب کرده و با کد زیر جایگزین نمایید:


SELECT Students.StudentNumber [Student #],
       Students.FirstName [First Name],
       Students.MiddleName [Middle Name],
       Students.LastName [Last Name],
       Students.BirthDate,
       DATEDIFF(yyyy, BirthDate, SYSDATETIME()) Age,
       Students.Gender
FROM Academics.UndergraduateStudents Students;
GO

2. برای اجرای دستورات کلید F5 را بزنید.

3. حال دستور را به صورت زیر ویرایش کنید:


SELECT Students.StudentNumber [Student #],
       Students.FirstName [First Name],
       Students.MiddleName [Middle Name],
       Students.LastName [Last Name],
       FORMAT(Students.BirthDate, N'f'),
       DATEDIFF(yyyy, BirthDate, SYSDATETIME()) Age,
       CASE Students.Gender
		WHEN N'M' THEN N'Male'
		WHEN N'F' THEN N'Female'
		ELSE N'Unknomn'
       END Gender
FROM Academics.UndergraduateStudents Students;
GO

4. دستور را اجرا نمایید.
آموزش SQL

بازیابی بخش هایی از مقدار Date (تابع DATENAME و DATEPART)

T-SQL توابع متعددی را برای بازیابی مقدار روز، ماه، روز تاریخ جاری ارائه می کند. یکی از این توابع DATENAME می باشد. نحوه ی کلی نگارش و استفاده از تابع ذکر شده به شرح زیر می باشد:


integer/nvarchar DATENAME(integer ReturnedValue, date Value);

آرگومان اول (ReturnedValue) مقداری را مشخص می کند که باید از تاریخ بازیابی شود (سال، ماه یا روز). دومین آرگومان مقدار تاریخ است که آرگومان اول از آن بازیابی می شود (یک متغیر حاوی مقدار تاریخ که می خواهیم بخش مورد نظر، ماه یا سال و یا روز را از آن بگیریم). به عنوان مثال، مقدار 20110229 خطا می دهد زیرا ماه فبریه ی سال 2011، 29 روزه نبوده است.
علاوه بر تابع DATENAME()، T-SQL تابعی به نام DATEPART() را ارائه می دهد. سینتکس آن به شرح زیر می باشد:


DATEPART(int DatePart, date Value)

دو تابع نام برده کاربردی یکسان دارند.

بازیابی مقدار روز از یک تاریخ – تابع DAY()

برای بازیابی مقدار روز از یک تاریخ معین، می توان تابع DAY() را فراخوانی کرد. نحوه ی استفاده از آن به شرح زیر می باشد:


int DAY(date Value);

این تابع به عنوان آرگومان یک مقدار تاریخ می گیرد و در خروجی شماره ی روز را برمی گرداند.


DECLARE @DateValue DATE,
        @Result int;
SET @DateValue = N'20121004';
SET @Result = DAY(@DateValue);
SELECT @DateValue AS Original;
SELECT @Result AS Result;
GO	

می توان بجای تابع نام برده، تابعDATENAME() را صدا زده و فرمت Day یا day و یا d و dd را به عنوان آرگومان به آن ارسال کنید.


مثال:
DECLARE @DateValue DATE,
        @Result int;
SET @DateValue = N'20121004';
SET @Result = DATENAME(dd, @DateValue);
SELECT @DateValue AS Original;
SELECT @Result AS Result;
GO

همچنین می توان تابع DATEPART() را فراخوانی کرده و فرمت های یاد شده در بالا را به عنوان آرگومان به آن پاس دهید.


مثال:
DECLARE @DateValue DATE,
        @StrValue int;
SET @DateValue = N'20120425';
SET @StrValue = DATEPART(Day, @DateValue);
SELECT @DateValue AS Original;
SELECT @StrValue AS Formatted;
GO

دو تابع مذکور نتیجه ی یکسان را تولید می کنند.


تابع MONTH()

برای بازیابی مقدار ماه یک تاریخ به صورت عدد، دو گزینه پیشرو دارید. یک گزینه استفاده از تابع MONTH() می باشد.


int MONTH(date Value);

این تابع یک تاریخ به عنوان آرگومان می گیرد و در خروجی شماره ی ماه را برمی گرداند


مثال:
DECLARE @DateValue DATE,
        @Result int;
SET @DateValue = N'20121004';
SET @Result = MONTH(@DateValue);
SELECT @DateValue AS Original;
SELECT @Result AS Result;
GO

تابع ذکر شده یک عدد صحیح به عنوان شماره ی مقدار ماه برمی گرداند. علاوه بر MONTH()، زبان T-SQL تابعDATENAME() را ارائه می دهد. برای بازیابی اسم ماه، Month یا month، m یا M را به عنوان آرگومان به تابع ارسال کنید. مقدار بازگشتی این تابع اسم ماه می باشد:


DECLARE @DateValue DATE,
        @Result nvarchar(30);
SET @DateValue = N'20121004';
SET @Result = DATENAME(mm, @DateValue);
SELECT @DateValue AS Original;
SELECT @Result AS Result;
GO

آموزش SQL

برای بازیابی مقدار ماه از یک تاریخ، می توان تابع DATEPART() را صدا زد. آرگومانی که به این تابع ارسال می کنید، همان پارامترهایی است که به تابع DATENAME() پاس می دهید.


مثال:
DECLARE @DateValue DATE,
        @StrValue int;
SET @DateValue = N'20120425';
SET @StrValue = DATEPART(Month, @DateValue);
SELECT @DateValue AS Original;
SELECT @StrValue AS Formatted;
GO

بازیابی مقدار سال از یک تاریخ

برای بازیابی مقدار سال از یک تاریخ، T-SQL تابع YEAR() را فراهم می کند. دستور بکار بردن آن به صورت زیر می باشد:


int YEAR(date Value);

مثال:
DECLARE @DateValue DATE,
        @Result int;
SET @DateValue = N'20121004';
SET @Result = YEAR(@DateValue);
SELECT @DateValue AS Original;
SELECT @Result AS Result;
GO

نتیجه ی زیر را بدست می دهد:
آموزش SQL

بازیابی مقدار سه ماه (ربع) از یک سال

سال از چهار بخش تشکیل شده است که هر یک سه ماه پشت سرهم را شامل می شود. هر یک از این بخش ها یک ربع یا یک چهارم اطلاق می گردد. یک چهارم سال به صورت یک مقدار عدد صحیح نمایش داده می شود. ربع اول سه ماه ژانویه، فبریه و مارس را دربرمی گیرد و با مقدار 1 نمایش داده می شود. برای بازیابی مقدار سه ماه از یک سال، می توان تابع DATENAME() یاDATEPART() را فراخوانی کرد. برای این منظور باید Quarter (quarter) یا q و یا qq را به عنوان آرگومان به تابع ذکر شده ارسال کرد. تابع یک عدد صحیح به عنوان خروجی برمی گرداند.


مثال:
DECLARE @DateValue DATE,
        @Result nvarchar(30);
SET @DateValue = N'20120714';
SET @Result = DATENAME(q, @DateValue);
SELECT @DateValue AS Original;
SELECT @Result AS Result;
GO

نتیجه ی زیر را برمی گرداند:
آموزش SQL

بازیابی مقدار هفته از یک سال

یک سال به 52 یا 53 بخش تقسیم شده و هر بخش یک هفته نامیده می شود. هر هفته خود از 7 روز پشت سرهم ساخته شده است. هفته به صورت یک عدد صحیح نمایش داده می شود. برای بازیابی شماره ی یک هفته از سال، یکی از دو تابع DATENAME() یا DATEPART() را فراخوانی کنید. به عنوان آرگومان نیز week، wk، ww را به تابع ارسال کنید.


مثال:
DECLARE @DateValue DATE,
        @Result nvarchar(30);
SET @DateValue = N'20121231';
SET @Result = DATENAME(Week, @DateValue);
SELECT @DateValue AS Original;
SELECT @Result AS Result;
GO

خروجی:
آموزش SQL
  • 6116
  •    0
  • تاریخ ارسال :   1394/12/06

دانشجویان گرامی اگر این مطلب برای شما مفید بود لطفا ما را در GooglePlus محبوب کنید
رمز عبور: tahlildadeh.com یا www.tahlildadeh.com
ارسال دیدگاه نظرات کاربران
شماره موبایل دیدگاه
عنوان پست الکترونیک

ارسال

آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

تمامی حقوق این سایت متعلق به آموزشگاه تحلیل داده می باشد .