سؤال

في SQL Server لدي DATETIME العمود الذي يتضمن عنصر الوقت.

مثال:

'14 AUG 2008 14:23:019'

ما هو أفضل طريقة لتحديد السجلات ليوم معين فقط، وتجاهل الجزء الزمني؟

مثال:(غير آمن، لأنه لا يتطابق مع الجزء الزمني ولا يُرجع أي صفوف)

DECLARE  @p_date DATETIME
SET      @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )

SELECT *
FROM   table1
WHERE  column_datetime = @p_date

ملحوظة:نظرًا لأن هذا الموقع يدور أيضًا حول تدوين الملاحظات والتقنيات التي تلتقطها ثم تنساها، فسوف أقوم بنشر إجابتي الخاصة على هذا السؤال لأن عناصر DATETIME في MSSQL هي على الأرجح الموضوع الذي أبحث عنه كثيرًا في SQLBOL.


تحديث توضيح المثال ليكون أكثر تحديدا.


يحرر آسف، لكن كان عليّ تعديل الإجابات الخاطئة (الإجابات التي تعرض نتائج خاطئة).

@جوريت: WHERE (date>'20080813' AND date<'20080815') سيعود يوم 13 و 14.

@wearejimbo: إغلاق، ولكن لا يوجد سيجار! الشارة الممنوحة لك.لقد فاتك السجلات المكتوبة في 14/08/2008 23:59:001 إلى 23:59:999 (أي.أقل من ثانية واحدة قبل منتصف الليل.)

هل كانت مفيدة؟

المحلول

التقنية 1:

 DECLARE @p_date DATETIME
 SET     @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )

 SELECT  *
 FROM    table1
 WHERE   column_datetime >= @p_date
 AND     column_datetime < DATEADD(d, 1, @p_date)

وتتمثل ميزة ذلك في أنه سيستخدم أي فهرس في "column_datetime" إذا كان موجودًا.

نصائح أخرى

في SQL Server 2008، يمكنك استخدام نوع البيانات DATE الجديد

DECLARE @pDate DATE='2008-08-14'  

SELECT colA, colB
FROM table1
WHERE convert(date, colDateTime) = @pDate  

@رجل.أعتقد أنك ستجد أن هذا الحل يتناسب تمامًا.الق نظرة على خطة تنفيذ الاستعلام من الاستعلام الأصلي الخاص بك.

ولل مِلكِي:

فقط قارن قيم السنة والشهر واليوم.

Declare @DateToSearch DateTime
Set @DateToSearch = '14 AUG 2008'

SELECT * 
FROM table1
WHERE Year(column_datetime) = Year(@DateToSearch)
      AND Month(column_datetime) = Month(@DateToSearch)
      AND Day(column_datetime) = Day(@DateToSearch)

شيء من هذا القبيل؟

SELECT  *
FROM    table1
WHERE   convert(varchar, column_datetime, 111) = '2008/08/14'

التقنية 2:

DECLARE @p_date DATETIME
SET     @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )

SELECT  *
FROM    table1
WHERE   DATEDIFF( d, column_datetime, @p_date ) = 0

إذا لم تتم فهرسة الحقل column_datetime، ومن غير المحتمل أن يتم فهرسته (أو من غير المحتمل استخدام الفهرس) فإن استخدام DATEDIFF() يكون أقصر.

نقطة جيدة حول الفهرس في الإجابة التي قبلتها.

ومع ذلك، إذا كنت تبحث حقًا فقط عن أشياء محددة DATE أو DATE ranges غالباً, ، فإن أفضل حل وجدته هو إضافة عمود محسوب مستمر آخر إلى الجدول الخاص بك والذي سيحتوي فقط على DATE, وأضف فهرسًا في هذا العمود:

ALTER TABLE "table1" 
    ADD "column_date" AS CONVERT(DATE, "column_datetime") PERSISTED

أضف فهرسًا في هذا العمود:

CREATE NONCLUSTERED INDEX "table1_column_date_nu_nci"
ON  "table1" ( "column_date" ASC )
GO

ثم سيكون بحثك أسرع:

DECLARE  @p_date DATE
SET      @p_date = CONVERT( DATE, '14 AUG 2008', 106 )

SELECT   *
FROM     table1
WHERE    column_date = @p_date

هذه الوظيفة Cast(Floor(Cast(GetDate() As Float)) كـ DateTime) تقوم بإرجاع نوع بيانات التاريخ والوقت مع إزالة جزء الوقت ويمكن استخدامه على هذا النحو.

Select
*
Table1
Where
Cast(Floor(Cast(Column_DateTime As Float)) As DateTime) = '14-AUG-2008'

أو

DECLARE  @p_date DATETIME
SET      @p_date = Cast('14 AUG 2008' as DateTime)

SELECT   *
FROM     table1
WHERE    Cast(Floor(Cast(column_datetime As Float)) As DateTime) = @p_date

كيفية الحصول على جزء التاريخ من حقل التاريخ والوقت في MS SQL Server:

واحدة من أسرع وأروع الطرق للقيام بذلك هي الاستخدام

DATEADD(dd, DATEDIFF( dd, 0, @DAY ), 0)

إنه يتجنب منطق خرق وحدة المعالجة المركزية "تحويل التاريخ إلى سلسلة بدون الوقت ثم تحويله مرة أخرى مرة أخرى".

كما أنه لا يكشف عن التنفيذ الداخلي المتمثل في "التعبير عن جزء الوقت ككسر" من التاريخ.

الحصول على تاريخ اليوم الأول من الشهر

DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0)

احصل على التاريخ rfom منذ عام واحد

DATEADD(m,-12,DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0))

أقوم عادةً بتحويل التاريخ والوقت إلى تاريخ ومقارنتهما، كما يلي:

SELECT 'Same Date' WHERE CAST(getDate() as date) = cast('2/24/2012 2:23 PM' as date)

أو

SELECT 'Same Date' WHERE DATEDIFF(dd, cast(getDate() as date), cast('2/24/2012 2:23 PM' as date)) = 0

أعلم أن هذا ليس بالضبط ما تريد القيام به، ولكن يمكن أن يكون بداية:

SELECT *
FROM (SELECT *, DATEPART(yy, column_dateTime) as Year, 
      DATEPART(mm, column_dateTime) as Month, 
      DATEPART(dd, column_dateTime) as Day 
      FROM table1)
WHERE Year = '2008'
AND Month = '8'
AND Day = '14'
SELECT  *
FROM    table1
WHERE   CONVERT(varchar(10),columnDatetime,121) = 
        CONVERT(varchar(10),CONVERT('14 AUG 2008' ,smalldatetime),121)

سيؤدي هذا إلى تحويل وقت البيانات والسلسلة إلى varchars بالتنسيق "YYYY-MM-DD".

وهذا أمر قبيح للغاية، ولكن يجب أن تعمل

يمكن مقارنة التاريخ في sqlserver باستخدام مقارنة السلسلة:على سبيل المثال

DECLARE @strDate VARCHAR(15)
SET @strDate ='07-12-2010'


SELECT * FROM table
WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112)
DECLARE @Dat

SELECT * 
FROM Jai
WHERE                                                                                                          
CONVERT(VARCHAR(2),DATEPART("dd",Date)) +'/'+                                                              
             CONVERT(VARCHAR(2),DATEPART("mm",Date)) +'/'+              
                     CONVERT(VARCHAR(4), DATEPART("yy",Date)) = @Dat

أفضل طريقة هي ببساطة استخراج جزء التاريخ باستخدام وظيفة SQL DATE():

SELECT * 
FROM table1
WHERE DATE(column_datetime) = @p_date;
SELECT * FROM tablename
WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012'
SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) + 
    '/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) + 
    '/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp

هناك العديد من التنسيقات للتاريخ في SQL والتي يتم تحديدها.يشير إلى https://msdn.microsoft.com/en-in/library/ms187928.aspx

تحويل ومقارنة عمود varchar مع التواريخ المحددة.

بناء الجملة:

SELECT * FROM tablename where CONVERT(datetime,columnname,103) 
    between '2016-03-01' and '2016-03-03'
In CONVERT(DATETIME,COLUMNNAME,103) "103" SPECIFIES THE DATE FORMAT as dd/mm/yyyy

في SQLServer

DECLARE @p_date DATE

SELECT * 
FROM table1
WHERE column_dateTime=@p_date

في C# تمرير السلسلة القصيرة لقيمة التاريخ باستخدام وظيفة ToshortDateString ().عينة:DateVariable.ToShortDateString();

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