เลือกข้อมูลจากช่วงวันที่ระหว่างวันที่สองวัน


101

ฉันมีตารางที่ตั้งชื่อProduct_Salesและมีข้อมูลเช่นนี้

Product_ID | Sold_by | Qty | From_date  | To_date
-----------+---------+-----+------------+-----------
3          | 12      | 7   | 2013-01-05 | 2013-01-07
6          | 22      | 14  | 2013-01-06 | 2013-01-10
8          | 11      | 9   | 2013-02-05 | 2013-02-11

คำถามคืออะไรถ้าฉันต้องการเลือกข้อมูลการขายระหว่างวันที่สองวันจากช่วงวันที่?

ตัวอย่างเช่นผมต้องการที่จะเลือกข้อมูลยอดขายจากการ2013-01-032013-01-09


To_date> 2013-01-03 AND From_date <2013-01-09. เหรอ?
jpulikkottil

คำตอบ:


148

คำอธิบายจุดตัดช่วง

อย่างที่คุณเห็นมีสองวิธีในการทำงานให้ลุล่วง:

  • เกณฑ์ตัวเลือกที่ยอมรับได้ทั้งหมด
  • ยกเว้นตัวเลือกที่ไม่ถูกต้องทั้งหมด

เห็นได้ชัดว่าวิธีที่สองนั้นง่ายกว่ามาก (มีเพียงสองกรณีต่อสี่)

SQL ของคุณจะมีลักษณะดังนี้:

SELECT * FROM Product_sales 
WHERE NOT (From_date > @RangeTill OR To_date < @RangeFrom)

14
ฉันแค่อยากจะบอกว่าฉันชอบที่คุณวาดสิ่งนี้บนกระดานสีขาวเพื่ออธิบายคำตอบ คุณมีความเคารพและชื่นชมของฉัน
Ben Bynum

3
ฉันรู้ว่าปัญหานี้ค่อนข้างเก่า แต่ถ้าคุณไม่ต้องการหรือไม่สามารถใช้WHERE NOTเงื่อนไขนี้ได้การหันไปรอบ ๆ ตัวดำเนินการและการเพิ่มค่าเท่ากับก็ทำงานได้เช่นกัน: SELECT * FROM Product_sales WHERE From_date <= @RangeTill OR To_date >= @RangeFrom
Laurenz Glück

86
SELECT * from Product_sales where
(From_date BETWEEN '2013-01-03'AND '2013-01-09') OR 
(To_date BETWEEN '2013-01-03' AND '2013-01-09') OR 
(From_date <= '2013-01-03' AND To_date >= '2013-01-09')

คุณต้องครอบคลุมความเป็นไปได้ทั้งหมด From_DateหรือTo_Dateอาจอยู่ระหว่างช่วงวันที่ของคุณหรือวันที่บันทึกอาจครอบคลุมทั้งช่วง

หากวันใดวันหนึ่งFrom_dateหรือTo_dateอยู่ระหว่างวันที่หรือFrom_dateน้อยกว่าวันที่เริ่มต้นและTo_dateมากกว่าวันที่สิ้นสุด จากนั้นควรส่งคืนแถวนี้


คำตอบของเพจ (Y)
GreenROBO

จะส่งคืนข้อมูลทั้งหมดได้อย่างไรหากวันที่ป้อนข้อมูลทั้งสองเป็นโมฆะหรือว่างเปล่า และหากวันใดวันหนึ่งเป็นโมฆะหรือว่างเปล่าควรได้ผลลัพธ์ตามเกณฑ์นั้น
Coding world

40

ลองทำตามคำค้นหาเพื่อรับวันที่ระหว่างช่วง:

SELECT  *
FROM    Product_sales 
WHERE   From_date >= '2013-01-03' AND
        To_date   <= '2013-01-09'

8
สิ่งนี้ไม่ครอบคลุมความเป็นไปได้ทั้งหมด!
FallenAngel

@FallenAngel คุณช่วยอธิบายฉันที่ไม่ครอบคลุมได้ไหม
Babblo

4
ตรวจสอบของฉันคำตอบโปรดคุณไม่ได้ครอบคลุมการขายที่เริ่มต้นก่อนstart_dateแต่จบระหว่างและstart_date end_dateในทางกลับกันคำถามนั้นไม่ชัดเจนพอที่ฉันเดาเราไม่มีเงื่อนงำว่าเราควรจะขายระหว่างวันที่ที่กำหนดหรือวันที่ซึ่งรวมช่วงวันที่บางส่วนไว้อย่างเคร่งครัด แต่อาจขยายด้านใดด้านหนึ่งหรือทั้งสองอย่าง? ดังนั้นปัญหาพื้นฐานเกี่ยวกับคำถามที่ฉันเดาไม่ชัดเจน
FallenAngel

ฉันรู้ว่าโพสต์นี้เก่า แต่สำหรับผู้ที่อ่าน: นี่ไม่ได้อยู่ระหว่างวันที่ แต่รวมถึงวันที่ จากและถึง
Ken

24
SELECT * FROM Product_sales 
WHERE From_date between '2013-01-03'
AND '2013-01-09'

การเลือกของคุณจะไม่ถูกต้องสำหรับตัวอย่าง From_date: 2012-12-30 ถึง To_Date: 2013-01-05 วันที่เหล่านี้อยู่ในช่วงที่ต้องการ แต่ใน SQL ของคุณจะไม่ถูกส่งกลับเนื่องจากเริ่มต้นก่อนช่วง แต่จะสิ้นสุดภายในช่วง
NetVicious

5
SELECT *
FROM Product_sales
WHERE (
From_date >= '2013-08-19'
AND To_date <= '2013-08-23'
)
OR (
To_date >= '2013-08-19'
AND From_date <= '2013-08-23'
)

1
สำหรับจุดตัดรวมคุณจะต้องเพิ่มอีกหนึ่งคำสั่ง OR เพื่อจับเมื่อ from_date อยู่ก่อนเริ่มต้นและ to_date อยู่หลังจุดสิ้นสุด: OR (To_date <= '2013-08-19' AND From_date> = '2013-08- 23 ')
ย้อนกลับ

5

สิ่งนี้ครอบคลุมเงื่อนไขทั้งหมดที่คุณกำลังมองหา

SELECT * from Product_sales where (From_date <= '2013-01-09' AND To_date >= '2013-01-01')

4

โปรดลอง:

DECLARE @FrmDt DATETIME, @ToDt DATETIME
SELECT @FrmDt='2013-01-03', @ToDt='2013-01-09'

SELECT * 
FROM Product_sales 
WHERE (@FrmDt BETWEEN From_date AND To_date) OR 
    (@ToDt BETWEEN From_date AND To_date)

3

เพียงแค่ 2 เซ็นต์ของฉันฉันพบว่าการใช้รูปแบบ "dd-MMM-yyyy" ปลอดภัยที่สุดเนื่องจากเซิร์ฟเวอร์ db จะรู้ว่าคุณต้องการอะไรโดยไม่คำนึงถึงการตั้งค่าภูมิภาคบนเซิร์ฟเวอร์ มิฉะนั้นคุณอาจประสบปัญหาบนเซิร์ฟเวอร์ที่มีการตั้งค่าภูมิภาควันที่เป็น yyyy-dd-mm (ไม่ว่าด้วยเหตุผลใดก็ตาม)

ดังนั้น:

SELECT * FROM Product_sales 
WHERE From_date >= '03-Jan-2013'
AND To_date <= '09-Jan-2013'

มันใช้ได้ดีสำหรับฉันเสมอ ;-)




2

ตรวจสอบคำค้นหานี้ฉันสร้างแบบสอบถามนี้เพื่อตรวจสอบว่าวันที่เช็คอินทับกับวันที่จองหรือไม่

SELECT * FROM tbl_ReservedRooms
WHERE NOT ('@checkindate' NOT BETWEEN fromdate AND todate
  AND '@checkoutdate'  NOT BETWEEN fromdate AND todate)

การดำเนินการนี้จะเรียกใช้รายละเอียดที่ทับซ้อนกันอีกครั้งเพื่อให้ได้รายละเอียดที่ไม่ทับซ้อนกันจากนั้นลบ 'NOT' ออกจากแบบสอบถาม



1
SELECT NULL  
    FROM   HRMTable hm(NOLOCK)  
    WHERE  hm.EmployeeID = 123
        AND (  
                (  
                    CAST(@Fromdate AS date) BETWEEN CAST(hm.FromDate AS date)  
                        AND CAST(hm.ToDate AS date)  
                )  
                OR (  
                    CAST(@Todate AS date) BETWEEN CAST(hm.FromDate AS date)  
                        AND CAST(hm.ToDate AS date)  
                   )  
                ) 
         )

1

คุณยังสามารถลองใช้ชิ้นส่วนต่อไปนี้:

select  * from  Product_sales 
where  From_date  >= '2013-01-03' and game_date  <= '2013-01-09'

1

ทำได้ง่ายใช้คำค้นหานี้เพื่อค้นหาข้อมูลที่เลือกจากช่วงวันที่ระหว่างวันที่สองวัน

select * from tabblename WHERE (datecolumn BETWEEN '2018-04-01' AND '2018-04-5')

0

คุณควรเปรียบเทียบวันที่ใน sql เช่นเดียวกับที่คุณเปรียบเทียบค่าตัวเลข

SELECT * FROM Product_sales
WHERE From_date >= '2013-01-01' AND To_date <= '2013-01-20'

0

นี่คือข้อความค้นหาเพื่อค้นหายอดขายผลิตภัณฑ์ทั้งหมดที่ทำงานในช่วงเดือนสิงหาคม

  • ค้นหา Product_sales ที่มีการใช้งานในช่วงเดือนสิงหาคม
  • รวมทุกสิ่งที่เริ่มก่อนสิ้นเดือนสิงหาคม
  • ไม่รวมสิ่งที่สิ้นสุดก่อนวันที่ 1 สิงหาคม

ยังเพิ่มคำสั่ง case เพื่อตรวจสอบความถูกต้องของแบบสอบถาม

SELECT start_date, 
       end_date, 
       CASE 
         WHEN start_date <= '2015-08-31' THEN 'true' 
         ELSE 'false' 
       END AS started_before_end_of_month, 
       CASE 
         WHEN NOT end_date <= '2015-08-01' THEN 'true' 
         ELSE 'false' 
       END AS did_not_end_before_begining_of_month 
FROM   product_sales 
WHERE  start_date <= '2015-08-31' 
       AND end_date >= '2015-08-01' 
ORDER  BY start_date; 

0
DECLARE @monthfrom int=null,
@yearfrom int=null,
@monthto int=null,
@yearto int=null,
@firstdate DATE=null,
@lastdate DATE=null

SELECT @firstdate=DATEADD(month,@monthfrom-1,DATEADD(year,@yearfrom-1900,0)) /*Setting First Date using From Month & Year*/
SELECT @lastdate= DATEADD(day,-1,DATEADD(month,@monthto,DATEADD(year,@yearto-1900,0)))/*Setting Last Date using From Month & Year*/

SELECT *  FROM tbl_Record
WHERE  (DATEADD(yy, Year - 1900, DATEADD(m, Month - 1, 1 - 1)) BETWEEN CONVERT(DATETIME, @firstdate, 102) AND 
CONVERT(DATETIME, @lastdate, 102))

-1

ง่ายมากใช้แบบสอบถามนี้เพื่อค้นหาสิ่งที่คุณต้องการ

select * from Product_Sales where From_date<='2018-04-11' and To_date>='2018-04-11'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.