it-swarm.asia

كيفية إرجاع التاريخ فقط من نوع بيانات SQL Server DateTime

SELECT GETDATE()

العوائد: 2008-09-22 15:24:13.790

أريد جزء التاريخ هذا دون الجزء الزمني: 2008-09-22 00:00:00.000

كيف يمكنني الحصول على ذلك؟

1590
eddiegroves

في SQL Server 2008 وأعلى ، يجب عليك CONVERT حتى الآن:

SELECT CONVERT(date, getdate())

في الإصدارات الأقدم ، يمكنك القيام بما يلي:

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))

فمثلا

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

يعطيني

2008-09-22 00:00:00.000

الايجابيات:

  • لا يلزم تحويل varchar <-> datetime
  • لا حاجة للتفكير في locale

كما اقترح مايكل

استخدم هذا المتغير: SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, getdate()))

select getdate()

SELECT DATEADD(hh, DATEDIFF(hh, 0, getdate()), 0)
SELECT DATEADD(hh, 0, DATEDIFF(hh, 0, getdate()))

SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, getdate()))

SELECT DATEADD(mm, DATEDIFF(mm, 0, getdate()), 0)
SELECT DATEADD(mm, 0, DATEDIFF(mm, 0, getdate()))

SELECT DATEADD(yy, DATEDIFF(yy, 0, getdate()), 0)
SELECT DATEADD(yy, 0, DATEDIFF(yy, 0, getdate()))

انتاج:

2019-04-19 08:09:35.557

2019-04-19 08:00:00.000
4763-02-17 00:00:00.000

2019-04-19 00:00:00.000
2019-04-19 00:00:00.000

2019-04-01 00:00:00.000
1903-12-03 00:00:00.000

2019-01-01 00:00:00.000
1900-04-30 00:00:00.000
2291
aku

يحتوي SQLServer 2008 الآن على نوع بيانات "تاريخ" والذي يحتوي فقط على تاريخ بدون مكون وقت. يمكن لأي شخص يستخدم SQLServer 2008 وما بعده القيام بما يلي:

SELECT CONVERT(date, GETDATE())
688
BenR

إذا كنت تستخدم SQL 2008 وما فوق:

select cast(getdate() as date)
155
abatishchev

DATEADD و DATEDIFF أفضل من التحويل إلى varchar. يحتوي كلا الاستعلامات على نفس خطة التنفيذ ، لكن خطط التنفيذ تدور حول data استراتيجيات الوصول ولا تكشف دائمًا عن التكاليف الضمنية المتضمنة في وقت وحدة المعالجة المركزية الذي يستغرقه تنفيذ جميع الأجزاء. إذا تم تشغيل كلا الاستعلامات مقابل جدول يحتوي على ملايين الصفوف ، يمكن أن يكون وقت وحدة المعالجة المركزية باستخدام DateDiff قريبًا من ثلث وقت تحويل وحدة المعالجة المركزية!

لمشاهدة خطط التنفيذ للاستعلامات:

set showplan_text on
GO 

سيقوم كل من DATEADD و DATEDIFF بتنفيذ CONVERT_IMPLICIT.

على الرغم من أن حل CONVERT أبسط وأسهل في القراءة بالنسبة للبعض ، إلا أنه {is أبطأ. ليست هناك حاجة للرجوع إلى التاريخ (يتم ذلك ضمنيًا بواسطة الخادم). لا توجد أيضًا حاجة حقيقية في طريقة DateDiff لـ DateAdd بعد ذلك حيث سيتم تحويل النتيجة الصحيحة أيضًا ضمنيًا إلى وقت/تاريخ.


SELECT CONVERT (varchar ، MyDate ، 101) من DatesTable

  |--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101)))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

حدد DATEADD (dd ، 0 ، DATEDIFF (dd ، 0 ، MyDate)) من DatesTable

  |--Compute Scalar(DEFINE:([Expr1004]=dateadd(day,(0),CONVERT_IMPLICIT(datetime,datediff(day,'1900-01-01 00:00:00.000',CONVERT_IMPLICIT(datetime,[TEST].[dbo].[DatesTable].[MyDate],0)),0))))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

استخدام FLOOR () كما اقترحdigi له أداء أقرب إلى DateDiff ، لكن لا ينصح به لأن اختيار نوع بيانات وقت البيانات لتطفو والعودة لا ينتج عنه دائمًا القيمة الأصلية.

تذكر الرجال: لا تصدقوا أحداً. انظر إلى إحصائيات الأداء واختبرها بنفسك!

كن حذرًا عند اختبار نتائجك. سيؤدي تحديد العديد من الصفوف إلى العميل إلى إخفاء اختلاف الأداء لأن الأمر يستغرق وقتًا أطول لإرسال الصفوف عبر الشبكة مما يفعل لإجراء العمليات الحسابية. لذلك تأكد من أن العمل لجميع الصفوف يتم بواسطة الخادم ولكن لا توجد مجموعة صفوف يتم إرسالها إلى العميل.

يبدو أن هناك بعض الالتباس عند بعض الأشخاص حول تأثير تحسين ذاكرة التخزين المؤقت على الاستعلامات. تشغيل استعلامين في نفس الدفعة أو في مجموعات منفصلة ليس له أي تأثير على التخزين المؤقت. بحيث يمكنك إما انتهاء صلاحية ذاكرة التخزين المؤقت يدويًا أو ببساطة تشغيل الاستعلامات ذهابًا وإيابًا عدة مرات. أي تحسين للاستعلام رقم 2 سيؤثر أيضًا على أي استعلامات لاحقة ، لذلك عليك التخلص من التنفيذ رقم 1 إذا أردت.

هنا هو البرنامج النصي للاختبار الكامل ونتائج الأداء التي تثبت أن DateDiff أسرع بكثير من التحويل إلى varchar.

70
Ricardo C

جرب هذا:

SELECT CONVERT(VARCHAR(10),GETDATE(),111)

العبارة أعلاه تحول تنسيقك الحالي إلى YYYY/MM/DD ، يرجى الرجوع إلى هذا الرابط لاختيار التنسيق المفضل لديك.

44
Nescio
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
37
Cade Roux

يمكنك استخدام الدالة CONVERT لإرجاع التاريخ فقط. انظر الرابط (الروابط) أدناه:

معالجة التاريخ والوقت في SQL Server 2000

CAST وتحويل

بناء الجملة الخاص باستخدام دالة التحويل هو:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 
19
DaveK

للعودة بتنسيق التاريخ

CAST (تاريخ الطلب كتاريخ)

سيعمل الرمز أعلاه في خادم sql 2010

سيعود مثل 12/12/2013

بالنسبة لـ SQL Server 2012 ، استخدم الرمز أدناه

CONVERT(VARCHAR(10), OrderDate , 111)
18
Mahesh ML
SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),103) --21/09/2011

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),101) --09/21/2011

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),111) --2011/09/21

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),107) --Sep 21, 2011
12
Rushda

باستخدام FLOOR () - فقط قطع الوقت جزء.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
12
DiGi

إذا كنت تستخدم SQL Server 2012 أو الإصدارات أعلاه ،

استخدام Format() وظيفة.

هناك بالفعل العديد من الإجابات وأنواع التنسيق لخادم SQL. لكن معظم الطرق غامضة إلى حد ما وسيكون من الصعب عليك تذكر أرقام نوع التنسيق أو وظائفه فيما يتعلق بتنسيق تاريخ محدد. لهذا السبب في الإصدارات القادمة من خادم SQL هناك خيار أفضل.

FORMAT ( value, format [, culture ] )

يعد خيار الثقافة مفيدًا للغاية ، حيث يمكنك تحديد التاريخ وفقًا للمشاهدين.

عليك أن تتذكر d (للأنماط الصغيرة) و D (للأنماط الطويلة).

1. "د" - نمط التاريخ القصير.

2009-06-15T13:45:30 -> 6/15/2009 (en-US)
2009-06-15T13:45:30 -> 15/06/2009 (fr-FR)
2009-06-15T13:45:30 -> 2009/06/15 (ja-JP)

2. "D" - نمط تاريخ طويل.

2009-06-15T13:45:30 -> Monday, June 15, 2009 (en-US)
2009-06-15T13:45:30 -> 15 июня 2009 г. (ru-RU)
2009-06-15T13:45:30 -> Montag, 15. Juni 2009 (de-DE)

المزيد من الأمثلة في الاستعلام.

DECLARE @d DATETIME = '10/01/2011';
SELECT FORMAT ( @d, 'd', 'en-US' ) AS 'US English Result'
      ,FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English Result'
      ,FORMAT ( @d, 'd', 'de-de' ) AS 'German Result'
      ,FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC) Result'; 

SELECT FORMAT ( @d, 'D', 'en-US' ) AS 'US English Result'
      ,FORMAT ( @d, 'D', 'en-gb' ) AS 'Great Britain English Result'
      ,FORMAT ( @d, 'D', 'de-de' ) AS 'German Result'
      ,FORMAT ( @d, 'D', 'zh-cn' ) AS 'Chinese (Simplified PRC) Result';

US English Result Great Britain English Result  German Result Simplified Chinese (PRC) Result
----------------  ----------------------------- ------------- -------------------------------------
10/1/2011         01/10/2011                    01.10.2011    2011/10/1

US English Result            Great Britain English Result  German Result                    Chinese (Simplified PRC) Result
---------------------------- ----------------------------- -----------------------------  ---------------------------------------
Saturday, October 01, 2011   01 October 2011               Samstag, 1. Oktober 2011        2011年10月1日

إذا كنت تريد المزيد من التنسيقات ، فيمكنك الانتقال إلى:

  1. سلاسل تنسيق التاريخ والوقت القياسية
  2. سلاسل التاريخ والوقت تنسيق مخصص
11
Somnath Muluk

إذا كنت ترغب في استخدام CONVERT والحصول على نفس الإخراج كما هو موضح في السؤال الأصلي المطروح ، أي yyyy-mm-dd ، ثم استخدم _CONVERT(varchar(10),[SourceDate as dateTime],121)_ code بنفس طريقة إجابات الزوجين السابقين ، لكن الكود لتحويله إلى yyyy-mm-dd مع شرطات هو 121.

إذا كان بإمكاني الحصول على صندوق الصابون الخاص بي لثانية واحدة ، هذا النوع من التنسيق لا ينتمي إلى فئة البيانات ، وهذا هو السبب في أنه لم يكن ممكناً بدون "حيل" عالية سخيفة حتى SQL Server 2008 عند تقديم أنواع بيانات datepart الفعلية. يعد إجراء مثل هذه التحويلات في مستوى البيانات مضيعة كبيرة للنفقات العامة على نظام إدارة قواعد البيانات لديك ، ولكن الأهم من ذلك ، أنه في الثانية التي تقوم فيها بشيء كهذا ، قمت بإنشاء بيانات يتيمة في الذاكرة افترض أنك ستعود إليها بعد ذلك إلى البرنامج. لا يمكنك إعادته إلى عمود 3NF + آخر أو مقارنته بأي شيء مكتوب دون الرجوع ، لذلك كل ما قمت به هو تقديم نقاط فشل وإزالة المرجع العلائقي.

يجب دائمًا المضي قدمًا وإرجاع نوع بيانات dateTime الخاص بك إلى برنامج الاتصال و في مستوى العرض التقديمي ، قم بإجراء أي تعديلات ضرورية. بمجرد أن تقوم بتحويل الأشياء قبل إعادتها إلى المتصل ، فإنك تزيل كل أمل في التكامل المرجعي من التطبيق. هذا من شأنه أن يمنع عملية التحديث أو الحذف ، مرة أخرى ، إلا إذا قمت بإجراء نوع من الارتداد اليدوي ، وهو ما يعرض بياناتك مرة أخرى لخطأ بشري/كود/gremlin عندما لا تكون هناك حاجة.

11
Focusyn
SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)

SELECT DATEADD(DAY, 0, DATEDIFF(DAY,0, GETDATE()))

SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101))

تحرير: أول طريقتين متشابهتين بشكل أساسي ، ويتم تنفيذ عملية التحويل إلى أسلوب varchar.

10
Gordon Bell

للحصول على النتيجة المشار إليها ، استخدم الأمر التالي.

SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))

أنا holpe أنها مفيدة.

9
Anderson Silva

إذا كنت بحاجة إلى نتيجة في نوع بيانات varchar ، فيجب أن تمر

SELECT CONVERT(DATE, GETDATE()) --2014-03-26
SELECT CONVERT(VARCHAR(10), GETDATE(), 111) --2014/03/26

الذي سبق ذكره أعلاه

إذا كنت بحاجة إلى نتيجة في تنسيق التاريخ والوقت ، فيجب عليك الاطلاع على أي من الاستعلام التالي

1) SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 111)) as OnlyDate --2014-03-26 00: 00: 00.000

2) SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 112)) as OnlyDate --2014-03-26 00: 00: 00.000

3)

 DECLARE  @OnlyDate DATETIME
   SET @OnlyDate = DATEDIFF(DD, 0, GETDATE())
   SELECT @OnlyDate AS OnlyDate

--2014-03-26 00: 00: 00.000

9
Stephon Johns
 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014
8
Ankit Khetan

إذا كنت تقوم بتعيين النتائج لعمود أو متغير ، فامنحه نوع DATE ، وكان التحويل ضمنيًا.

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03
7
Art Schmidt

حسنًا ، على الرغم من تأخري قليلاً :) ، إليك الحل الآخر.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DATETIME)

نتيجة

2008-09-22 00:00:00.000

وإذا كنت تستخدم SQL Server 2012 وأعلى ، فيمكنك استخدام وظيفة FORMAT() مثل هذا -

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')
6
Krishnraj Rana

أعتقد أن هذا سينجح في حالتك:

CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
6
bishnu karki

حتى باستخدام MSSQL Server 7.0 القديم ، فإن الكود هنا (بإذن من هذا link ) يسمح لي بالحصول على أي تنسيق تاريخ كنت أبحث عنه في ذلك الوقت:

PRINT '1) Date/time in format MON DD YYYY HH:MI AM (OR PM): ' + CONVERT(CHAR(19),GETDATE())  
PRINT '2) Date/time in format MM-DD-YY: ' + CONVERT(CHAR(8),GETDATE(),10)  
PRINT '3) Date/time in format MM-DD-YYYY: ' + CONVERT(CHAR(10),GETDATE(),110) 
PRINT '4) Date/time in format DD MON YYYY: ' + CONVERT(CHAR(11),GETDATE(),106)
PRINT '5) Date/time in format DD MON YY: ' + CONVERT(CHAR(9),GETDATE(),6) 
PRINT '6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): ' + CONVERT(CHAR(24),GETDATE(),113)

أنتجت هذا الإخراج:

1) Date/time in format MON DD YYYY HH:MI AM (OR PM): Feb 27 2015  1:14PM
2) Date/time in format MM-DD-YY: 02-27-15
3) Date/time in format MM-DD-YYYY: 02-27-2015
4) Date/time in format DD MON YYYY: 27 Feb 2015
5) Date/time in format DD MON YY: 27 Feb 15
6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): 27 Feb 2015 13:14:46:630
5
Matt O'Brien
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)
5
etni

ببساطة يمكنك القيام بهذه الطريقة:

SELECT CONVERT(date, getdate())
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

المخرجات كـ:

2008-09-22 00:00:00.000

أو ببساطة تفعل مثل هذا:

SELECT CONVERT (DATE, GETDATE()) 'Date Part Only'

نتيجة:

Date Part Only
--------------
2013-07-14
4
Amar Srivastava

بدءًا من SQL Server 2012 ، يمكنك القيام بذلك:

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')

4
xbb

أفضِّل ما يلي لم يرد ذكره:

DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))

كما أنها لا تهتم بالشبكة المحلية أو تقوم بتحويل مزدوج - على الرغم من أن كل "datepart" ربما يقوم بالرياضيات. لذلك قد يكون أبطأ قليلاً من طريقة مؤرخة ، ولكن بالنسبة لي هو أكثر وضوحا. خاصةً عندما أرغب في التجميع حسب السنة والشهر فقط (اضبط اليوم على 1).

4
Gerard ONeill

على SQL Server 2000

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)
4
kaub0st3r

تاريخ:

 SELECT CONVERT (date، GETDATE ()) 
 SELECT CAST (GETDATE () as date) 

زمن:

 SELECT CONVERT (الوقت ، GETDATE () ، 114) 
 SELECT CAST (GETDATE () كوقت) 
4
Kris Khairallah

لماذا لا تستخدم DATE_FORMAT (your_datetiem_column ، '٪ d-٪ m-٪ Y')؟

مثال: select DATE_FORMAT( some_datetime_column, '%d-%m-%Y' ) from table_name

يمكنك تغيير تسلسل m و d والسنة من خلال إعادة ترتيب جزء '%d-%m-%Y'

3
Janaka R Rajapaksha

كان هذا في عداد المفقودين في جميع الإجابات ، قد لا تكون أكثر كفاءة ولكن من السهل جدا للكتابة والفهم ، لا حاجة إلى أسلوب ، لا وظائف معقدة التاريخ.

SELECT CONVERT(DATETIME,CONVERT(DATE,((GETDATE()))))
3
Imad

أعلم أن هذا قديم ، لكنني لا أرى من أعلن أي شخص بهذه الطريقة. من ما يمكنني قوله ، هذا هو معيار ANSI.

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

سيكون من الجيد أن تدعم Microsoft أيضًا متغير CURRENT_DATE ANSI القياسي.

3
lit

التاريخ (حقل التاريخ والوقت) و DATE_FORMAT (التاريخ والوقت ، '٪ Y-٪ m-٪ d') كلا العوائد التاريخ فقط من التاريخ والوقت

2
Surekha
SELECT * FROM tablename WHERE CAST ([my_date_time_var] AS DATE)= '8/5/2015'
2
Binitta Mary

جرب هذا:

SELECT CONVERT(date, GETDATE()) as date
2
Rafiqul Islam

نهجي المشترك للحصول على موعد دون جزء من الوقت ..

 SELECT CONVERT(VARCHAR(MAX),GETDATE(),103)

 SELECT CAST(GETDATE() AS DATE)
2
Spider

يمكنك استخدام التالي لجزء التاريخ وتنسيق التاريخ:

DATENAME => إرجاع سلسلة أحرف تمثل تاريخ التاريخ المحدد في التاريخ المحدد

DATEADD => يتم استخدام الدالة DATEPART() لإرجاع جزء واحد من التاريخ/الوقت ، مثل السنة والشهر واليوم والساعة والدقيقة وما إلى ذلك.

DATEPART => إرجاع عدد صحيح يمثل تاريخ التاريخ المحدد في التاريخ المحدد.

CONVERT() => دالة CONVERT() هي وظيفة عامة تحول تعبيرًا عن نوع بيانات إلى آخر. يمكن استخدام دالة CONVERT() لعرض بيانات التاريخ/الوقت بتنسيقات مختلفة.

2
user1151326

إذا كنت تستخدم SQL 2008 وما فوق: SELECT CONVERT(DATE ,GETDATE())

1
Morteza Sefidi

إسلوبي

      select Convert(smalldatetime,Convert(int,Convert(float,getdate())))
1
CAGDAS AYDIN

حدد تحويل (getdate () كـ daselect CONVERT (وقت ، CONVERT (date ، getdate ())) te)

0
mokh223

يمكنك استخدام مثل أدناه لنوع مختلف من الإخراج للتاريخ فقط

  1. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 103)) ----- يوم/شهر/سنة

  2. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))------ شهر/يوم/سنة

  3. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 102))

0
ankit soni
select cast(createddate as date) as derivedate from table 

creatate هو عمود تاريخك ، وهذا يعمل مع sqlserver

0
karthik kasubha

SELECT CONVERT (تاريخ ، getdate ())

0
Shiraj Momin

يمكنك ببساطة استخدام الكود أدناه للحصول على جزء التاريخ فقط وتجنب الجزء الزمني في SQL:

SELECT SYSDATE TODAY FROM DUAL; 
0
Shyam Bhimani

أسهل طريقة هي استخدام: SELECT DATE(GETDATE())

0
Jithin Joy

واو ، اسمحوا لي أن أحسب الطرق التي يمكنك القيام بها. (لا يقصد التوريه)

من أجل الحصول على النتائج التي تريدها في هذا التنسيق على وجه التحديد:

2008-09-22

وهنا عدد قليل من الخيارات.

SELECT CAST(GETDATE() AS DATE) AS 'Date1'
SELECT Date2  = CONVERT(DATE, GETDATE())
SELECT CONVERT(DATE, GETDATE()) AS 'Date3'
SELECT CONVERT(CHAR(10), GETDATE(), 121) AS 'Date4'
SELECT CONVERT(CHAR(10), GETDATE(), 126) AS 'Date5'
SELECT CONVERT(CHAR(10), GETDATE(), 127) AS 'Date6'

لذا ، أقترح عليك اختيار طريقة تروق لك واستخدام هذه الطريقة في جميع الجداول.

كل هذه الخيارات ترجع التاريخ بالتنسيق نفسه بالضبط. لماذا مزود خدمة لديها مثل هذا التكرار؟

ليس لدي فكرة ، لكنهم يفعلون ذلك. ربما شخص أكثر ذكاء مني يمكن الإجابة على هذا السؤال.

أمل أن هذا يساعد شخصاما.

0
Aubrey Love