كيفية العودة فقط تاريخ من SQL Server نوع البيانات تاريخ / وقت

StackOverflow https://stackoverflow.com/questions/113045

سؤال

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.كل الاستفسارات نفس خطة التنفيذ ، ولكن تنفيذ خطط primarly عن البيانات الوصول إلى استراتيجيات و لا تكشف دائما الضمنية التكاليف المتضمنة في وحدة المعالجة المركزية الوقت المستغرق لأداء كل قطعة.إذا كان كل الاستفسارات تدار ضد طاولة مع الملايين من الصفوف ، وقت وحدة المعالجة المركزية باستخدام DateDiff يمكن أن تكون قريبة من 1/3 من تحويل الوقت وحدة المعالجة المركزية!

أن نرى تنفيذ خطط الاستفسارات:

set showplan_text on
GO 

كل DATEADD و DATEDIFF لتنفيذ CONVERT_IMPLICIT.

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


حدد تحويل(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]))

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

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

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

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

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

جرب هذا:

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

البيان أعلاه يحول الشكل الحالي إلى YYYY/MM/DD, الرجاء الرجوع إلى هذا الرابط اختيار أفضل شكل.

SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))

يمكنك استخدام CONVERT وظيفة للعودة فقط حتى الآن.انظر الرابط(s) التالية:

التاريخ والوقت التلاعب في SQL Server 2000

يلقي وتحويل

بناء الجملة من أجل استخدام تحويل وظيفة:

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

من أجل العودة في تنسيق التاريخ

يلقي(OrderDate تاريخ)

رمز أعلاه سوف تعمل في sql server 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

استخدام الكلمة() - مجرد قطع الوقت جزء.

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

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

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

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

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."د" - تاريخ طويل نمط.

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. عرف التاريخ والوقت شكل سلاسل

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

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

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

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)) كما OnlyDate --2014-03-26 00:00:00.000

2) SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 112)) كما 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

إذا قمت بتعيين النتائج إلى عمود أو متغير ، وإعطائها تاريخ ونوع التحويل الضمني.

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03

أعتقد أن هذا العمل في حالة:

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

حسنا, على الرغم من أنني متأخر نوعا ما :), هنا هو حل آخر.

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')

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

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 CAST(GETDATE() as date)

الوقت:

SELECT CONVERT(time , GETDATE() , 114)
SELECT CAST(GETDATE() as time)

أنا صالح التالية التي لم يكن المذكورة:

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

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

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

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

في SQL Server 2000

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

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

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

لماذا لا تستخدم DATE_FORMAT( your_datetiem_column, '%d-%m-%Y' ) ?

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

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

أعرف أن هذا هو القديم, ولكن أنا لا أرى فيها أحدا ذكر ذلك بهذه الطريقة.من ما أستطيع أن أقول, هذا هو ANSI القياسية.

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

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

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

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

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

DATENAME => بإرجاع سلسلة أحرف يمثل المحدد datepart من الموعد المحدد

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

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

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top