SELECT GETDATE()
العوائد: 2008-09-22 15:24:13.790
أريد جزء التاريخ هذا دون الجزء الزمني: 2008-09-22 00:00:00.000
كيف يمكنني الحصول على ذلك؟
في 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
يحتوي SQLServer 2008 الآن على نوع بيانات "تاريخ" والذي يحتوي فقط على تاريخ بدون مكون وقت. يمكن لأي شخص يستخدم SQLServer 2008 وما بعده القيام بما يلي:
SELECT CONVERT(date, GETDATE())
إذا كنت تستخدم SQL 2008 وما فوق:
select cast(getdate() as date)
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.
جرب هذا:
SELECT CONVERT(VARCHAR(10),GETDATE(),111)
العبارة أعلاه تحول تنسيقك الحالي إلى YYYY/MM/DD
، يرجى الرجوع إلى هذا الرابط لاختيار التنسيق المفضل لديك.
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
يمكنك استخدام الدالة CONVERT
لإرجاع التاريخ فقط. انظر الرابط (الروابط) أدناه:
معالجة التاريخ والوقت في SQL Server 2000
بناء الجملة الخاص باستخدام دالة التحويل هو:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
للعودة بتنسيق التاريخ
CAST (تاريخ الطلب كتاريخ)
سيعمل الرمز أعلاه في خادم sql 2010
سيعود مثل 12/12/2013
بالنسبة لـ SQL Server 2012 ، استخدم الرمز أدناه
CONVERT(VARCHAR(10), OrderDate , 111)
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
باستخدام FLOOR () - فقط قطع الوقت جزء.
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
استخدام Format()
وظيفة.
هناك بالفعل العديد من الإجابات وأنواع التنسيق لخادم SQL. لكن معظم الطرق غامضة إلى حد ما وسيكون من الصعب عليك تذكر أرقام نوع التنسيق أو وظائفه فيما يتعلق بتنسيق تاريخ محدد. لهذا السبب في الإصدارات القادمة من خادم SQL هناك خيار أفضل.
FORMAT ( value, format [, culture ] )
يعد خيار الثقافة مفيدًا للغاية ، حيث يمكنك تحديد التاريخ وفقًا للمشاهدين.
عليك أن تتذكر d (للأنماط الصغيرة) و D (للأنماط الطويلة).
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)
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日
إذا كنت تريد المزيد من التنسيقات ، فيمكنك الانتقال إلى:
إذا كنت ترغب في استخدام CONVERT والحصول على نفس الإخراج كما هو موضح في السؤال الأصلي المطروح ، أي yyyy-mm-dd ، ثم استخدم _CONVERT(varchar(10),[SourceDate as dateTime],121)
_ code بنفس طريقة إجابات الزوجين السابقين ، لكن الكود لتحويله إلى yyyy-mm-dd مع شرطات هو 121.
إذا كان بإمكاني الحصول على صندوق الصابون الخاص بي لثانية واحدة ، هذا النوع من التنسيق لا ينتمي إلى فئة البيانات ، وهذا هو السبب في أنه لم يكن ممكناً بدون "حيل" عالية سخيفة حتى SQL Server 2008 عند تقديم أنواع بيانات datepart الفعلية. يعد إجراء مثل هذه التحويلات في مستوى البيانات مضيعة كبيرة للنفقات العامة على نظام إدارة قواعد البيانات لديك ، ولكن الأهم من ذلك ، أنه في الثانية التي تقوم فيها بشيء كهذا ، قمت بإنشاء بيانات يتيمة في الذاكرة افترض أنك ستعود إليها بعد ذلك إلى البرنامج. لا يمكنك إعادته إلى عمود 3NF + آخر أو مقارنته بأي شيء مكتوب دون الرجوع ، لذلك كل ما قمت به هو تقديم نقاط فشل وإزالة المرجع العلائقي.
يجب دائمًا المضي قدمًا وإرجاع نوع بيانات dateTime الخاص بك إلى برنامج الاتصال و في مستوى العرض التقديمي ، قم بإجراء أي تعديلات ضرورية. بمجرد أن تقوم بتحويل الأشياء قبل إعادتها إلى المتصل ، فإنك تزيل كل أمل في التكامل المرجعي من التطبيق. هذا من شأنه أن يمنع عملية التحديث أو الحذف ، مرة أخرى ، إلا إذا قمت بإجراء نوع من الارتداد اليدوي ، وهو ما يعرض بياناتك مرة أخرى لخطأ بشري/كود/gremlin عندما لا تكون هناك حاجة.
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.
للحصول على النتيجة المشار إليها ، استخدم الأمر التالي.
SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))
أنا holpe أنها مفيدة.
إذا كنت بحاجة إلى نتيجة في نوع بيانات 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
Convert(nvarchar(10), getdate(), 101) ---> 5/12/14
Convert(nvarchar(12), getdate(), 101) ---> 5/12/2014
إذا كنت تقوم بتعيين النتائج لعمود أو متغير ، فامنحه نوع DATE ، وكان التحويل ضمنيًا.
DECLARE @Date DATE = GETDATE()
SELECT @Date --> 2017-05-03
حسنًا ، على الرغم من تأخري قليلاً :) ، إليك الحل الآخر.
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')
أعتقد أن هذا سينجح في حالتك:
CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
حتى باستخدام 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
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'
SELECT CONVERT(DATE, @yourdate)
ببساطة يمكنك القيام بهذه الطريقة:
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
بدءًا من SQL Server 2012 ، يمكنك القيام بذلك:
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')
أفضِّل ما يلي لم يرد ذكره:
DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))
كما أنها لا تهتم بالشبكة المحلية أو تقوم بتحويل مزدوج - على الرغم من أن كل "datepart" ربما يقوم بالرياضيات. لذلك قد يكون أبطأ قليلاً من طريقة مؤرخة ، ولكن بالنسبة لي هو أكثر وضوحا. خاصةً عندما أرغب في التجميع حسب السنة والشهر فقط (اضبط اليوم على 1).
على SQL Server 2000
CAST(
(
STR( YEAR( GETDATE() ) ) + '/' +
STR( MONTH( GETDATE() ) ) + '/' +
STR( DAY( GETDATE() ) )
)
AS DATETIME)
تاريخ:
SELECT CONVERT (date، GETDATE ()) SELECT CAST (GETDATE () as date)
زمن:
SELECT CONVERT (الوقت ، GETDATE () ، 114) SELECT CAST (GETDATE () كوقت)
لماذا لا تستخدم 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'
كان هذا في عداد المفقودين في جميع الإجابات ، قد لا تكون أكثر كفاءة ولكن من السهل جدا للكتابة والفهم ، لا حاجة إلى أسلوب ، لا وظائف معقدة التاريخ.
SELECT CONVERT(DATETIME,CONVERT(DATE,((GETDATE()))))
أعلم أن هذا قديم ، لكنني لا أرى من أعلن أي شخص بهذه الطريقة. من ما يمكنني قوله ، هذا هو معيار ANSI.
SELECT CAST(CURRENT_TIMESTAMP AS DATE)
سيكون من الجيد أن تدعم Microsoft أيضًا متغير CURRENT_DATE ANSI القياسي.
التاريخ (حقل التاريخ والوقت) و DATE_FORMAT (التاريخ والوقت ، '٪ Y-٪ m-٪ d') كلا العوائد التاريخ فقط من التاريخ والوقت
SELECT * FROM tablename WHERE CAST ([my_date_time_var] AS DATE)= '8/5/2015'
جرب هذا:
SELECT CONVERT(date, GETDATE()) as date
نهجي المشترك للحصول على موعد دون جزء من الوقت ..
SELECT CONVERT(VARCHAR(MAX),GETDATE(),103)
SELECT CAST(GETDATE() AS DATE)
يمكنك استخدام التالي لجزء التاريخ وتنسيق التاريخ:
DATENAME => إرجاع سلسلة أحرف تمثل تاريخ التاريخ المحدد في التاريخ المحدد
DATEADD => يتم استخدام الدالة DATEPART()
لإرجاع جزء واحد من التاريخ/الوقت ، مثل السنة والشهر واليوم والساعة والدقيقة وما إلى ذلك.
DATEPART => إرجاع عدد صحيح يمثل تاريخ التاريخ المحدد في التاريخ المحدد.
CONVERT()
=> دالة CONVERT()
هي وظيفة عامة تحول تعبيرًا عن نوع بيانات إلى آخر. يمكن استخدام دالة CONVERT()
لعرض بيانات التاريخ/الوقت بتنسيقات مختلفة.
إذا كنت تستخدم SQL 2008 وما فوق: SELECT CONVERT(DATE ,GETDATE())
إسلوبي
select Convert(smalldatetime,Convert(int,Convert(float,getdate())))
حدد تحويل (getdate () كـ daselect CONVERT (وقت ، CONVERT (date ، getdate ())) te)
يمكنك استخدام مثل أدناه لنوع مختلف من الإخراج للتاريخ فقط
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 103))
----- يوم/شهر/سنة
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
------ شهر/يوم/سنة
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 102))
select cast(createddate as date) as derivedate from table
creatate هو عمود تاريخك ، وهذا يعمل مع sqlserver
SELECT CONVERT (تاريخ ، getdate ())
يمكنك ببساطة استخدام الكود أدناه للحصول على جزء التاريخ فقط وتجنب الجزء الزمني في SQL:
SELECT SYSDATE TODAY FROM DUAL;
أسهل طريقة هي استخدام: SELECT DATE(GETDATE())
واو ، اسمحوا لي أن أحسب الطرق التي يمكنك القيام بها. (لا يقصد التوريه)
من أجل الحصول على النتائج التي تريدها في هذا التنسيق على وجه التحديد:
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'
لذا ، أقترح عليك اختيار طريقة تروق لك واستخدام هذه الطريقة في جميع الجداول.
كل هذه الخيارات ترجع التاريخ بالتنسيق نفسه بالضبط. لماذا مزود خدمة لديها مثل هذا التكرار؟
ليس لدي فكرة ، لكنهم يفعلون ذلك. ربما شخص أكثر ذكاء مني يمكن الإجابة على هذا السؤال.
أمل أن هذا يساعد شخصاما.