Permintaan SQL untuk memilih tanggal antara dua tanggal

303

Saya punya start_datedan end_date. Saya ingin mendapatkan daftar tanggal di antara dua tanggal ini. Adakah yang bisa membantu saya menunjukkan kesalahan dalam permintaan saya.

select Date,TotalAllowance 
from Calculation 
where EmployeeId=1
  and Date between 2011/02/25 and 2011/02/27

Berikut Dateini adalah datetimevariabel.

Neeraj
sumber

Jawaban:

484

Anda harus meletakkan kedua tanggal di antara tanda kutip tunggal seperti ..

select Date, TotalAllowance from Calculation where EmployeeId = 1
             and Date between '2011/02/25' and '2011/02/27'

atau bisa digunakan

select Date, TotalAllowance from Calculation where EmployeeId = 1
             and Date >= '2011/02/25' and Date <= '2011/02/27'

perlu diingat bahwa kencan pertama bersifat inklusif, tetapi yang kedua eksklusif, karena efektif adalah '2011/02/27 00:00:00'

Deepak
sumber
42
SQL Server default tanggal tanpa waktu ke 00:00:00. Jadi, bukankah kueri ini akan mengembalikan apa pun mulai 2011/02/25 dan 2011/02/26 di tengah malam?
Matt
5
@Deepak, bit kedua Anda harus mengatakan> = dan <=
IndoKnight
3
Anda mungkin menyebutkan bahwa urutan itu penting dalam fungsi ANTARA. Itu harus pergi dari yang tertua di sebelah kiri dan yang lebih baru di sebelah kanan. Ini tidak intuitif karena = adalah operator komparatif dalam sql dan berfungsi untuk "EmployeeId = 1" atau "1 = EmployeeId" dalam klausa where.
Fi Horan
@Matt, menurut dokumentasi untuk antara , jika satu baris memiliki tanggal 2011/02/27 tanpa waktu, maka baris itu setara dengan memiliki tanggal 2011/02/27 00:00 dan akan dikembalikan di permintaan, karena kurang dari atau sama dengan 2011/02/27 00:00. Jadi, jika Anda tidak berurusan dengan waktu, betweenharus bekerja seperti yang diharapkan.
timctran
@timctran Benar, tapi 2011/02/27 00:00 adalah apa yang kita sebut tengah malam 2011/02/26. Agaknya, kueri berarti menyertakan tanggal 27 di set hasil - tetapi entri dengan stempel waktu 2011/02/27 5:00 tidak akan disertakan.
Sinjai
128

Karena datetime tanpa segmen waktu yang ditentukan akan memiliki nilai date 00:00:00.000, jika Anda ingin memastikan Anda mendapatkan semua tanggal dalam rentang Anda, Anda harus menyediakan waktu untuk tanggal berakhir Anda atau meningkatkan tanggal berakhir Anda dan digunakan <.

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date between '2011/02/25' and '2011/02/27 23:59:59.999'

ATAU

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date >= '2011/02/25' and Date < '2011/02/28'

ATAU

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date >= '2011/02/25' and Date <= '2011/02/27 23:59:59.999'

JANGAN gunakan yang berikut ini, karena dapat mengembalikan beberapa catatan dari 2011/02/28 jika waktunya adalah 00: 00: 00.000.

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date between '2011/02/25' and '2011/02/28'
WelshDragon
sumber
42
Orang-orang masih melihat pertanyaan-pertanyaan dan jawaban-jawaban ini, bahkan jika mereka awalnya diajukan beberapa waktu lalu. Saya datang mencari jawaban, dan banyak dari apa yang saya lihat di sini tidak lengkap atau sama sekali tidak benar. Jawaban saya tidak akan membantu poster asli, tetapi mungkin membantu seseorang, bahkan mungkin tiga tahun dari sekarang.
WelshDragon
3
Jawaban Anda sangat membantu saya, @WelshDragon - Jawaban lain mengabaikan kenyataan bahwa format tanggal harus "tanggal sederhana" di server untuk mengabaikan jam. "<= END_DATE" mengasumsikan 12AM, yang saya tidak tahu. Saya melakukan kueri dengan "... <= 01/01/2014" dan saya tidak tahu mengapa pesanan pada tanggal itu tidak muncul untuk tanggal 1. Terima kasih banyak.
Keith
@ Welshragon - jawaban Anda adalah bahan yang sangat baik untuk menggunakan tanggal sebagai klausa mana. Terima kasih
Jack Frost
apa yang salah jika itu kembali '2011/02/28 00:00:00.000'?
Muflix
1
Mencoba ini hari ini, Anda juga dapat menggunakan convert(date, Date) between '2011/02/25' and '2011/02/27'(setidaknya dengan MS SQL Server terbaru). Bagian convert()akan menangani pengupasan bagian waktu dan perbandingan antara kemudian akan bekerja seperti yang diharapkan.
sensei
14

Coba ini:

select Date,TotalAllowance from Calculation where EmployeeId=1
             and [Date] between '2011/02/25' and '2011/02/27'

Nilai tanggal harus diketik sebagai string.

Untuk memastikan pemeriksaan Anda di masa depan untuk SQL Server 2008 dan lebih tinggi, Date harus diloloskan karena itu kata cadangan di versi yang lebih baru.

Ingatlah bahwa tanggal tanpa waktu memakan waktu tengah malam sebagai defaultnya, jadi Anda mungkin tidak memiliki nilai yang benar di sana.


sumber
1
Tanggal bukan kata kunci dan tidak perlu diloloskan. Penyorotan sintaksis hanyalah penyorotan sintaksis, kata kunci hanya perlu diloloskan jika mereka menyebabkan kesalahan sintaksis. Ini juga merupakan praktik yang baik untuk menggunakan konversi eksplisit alih-alih konversi implisit datestring. - dan Tanggal antara CAST ('2011/02 / 25'AS DATETIME) dan CAST (' 2011/02 / 27'AS DATETIME)
tponthieux
5
Tentu saja Anda benar jika ini adalah SQL Server 2005, yang ditandai oleh OP. Namun, Date dicadangkan pada tahun 2008 dan lebih tinggi, jadi untuk pemeriksaan di masa depan, tidak ada salahnya menghindarinya. Saya sudah mengedit jawaban saya.
1
Jika dia akan menentukan tanggal tunggal untuk keduanya itu akan mengembalikan nol baris tapi saya kira itu bukan persyaratan op
Zo Has
12
select * from table_name where col_Date between '2011/02/25' 
AND DATEADD(s,-1,DATEADD(d,1,'2011/02/27'))

Di sini, pertama tambahkan satu hari ke tanggal akhir saat ini 2011-02-28 00:00:00, maka, maka Anda kurangi satu detik untuk membuat tanggal akhir 2011-02-27 23:59:59. Dengan melakukan ini, Anda bisa mendapatkan semua tanggal di antara interval yang diberikan.

output:
2011/02/25
2011/02/26
2011/02/27
Chandra Prakash
sumber
8
select * from test 
     where CAST(AddTime as datetime) between '2013/4/4' and '2014/4/4'

- jika tipe data berbeda

hamze shoae
sumber
5

Query ini bagus untuk mengambil nilai antara tanggal saat ini dan 3 tanggal berikutnya

SELECT * FROM tableName  WHERE columName 
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)

Ini pada akhirnya akan menambah buffer tambahan 3 hari ke tanggal saat ini.

Vinit Kadkol
sumber
5

Ini sudah sangat tua, tetapi mengingat banyak pengalaman yang saya miliki dengan tanggal, Anda mungkin ingin mempertimbangkan ini: Orang menggunakan pengaturan regional yang berbeda, seperti itu, beberapa orang (dan beberapa database / komputer, tergantung pada pengaturan regional) dapat membaca ini tanggal 11/12/2016 sebagai 11 Desember 2016 atau 12 November 2016. Terlebih lagi, 16/11/12 yang dipasok ke basis data MySQL akan dikonversi secara internal menjadi 12 November 2016, sedangkan basis data Access yang berjalan pada komputer pengaturan regional Inggris akan menafsirkan dan simpan sebagai 16 Nov 2012.

Oleh karena itu, saya membuat kebijakan saya untuk menjadi eksplisit setiap kali saya akan berinteraksi dengan tanggal dan basis data. Jadi saya selalu menyediakan kueri dan kode pemrograman saya sebagai berikut:

SELECT FirstName FROM Students WHERE DoB >= '11 Dec 2016';

Perhatikan juga bahwa Access akan menerima #, dengan demikian:

SELECT FirstName FROM Students WHERE DoB >= #11 Dec 2016#;

tetapi MS SQL server tidak akan, jadi saya selalu menggunakan "'" seperti di atas, yang diterima oleh kedua database.

Dan ketika mendapatkan tanggal itu dari variabel dalam kode, saya selalu mengonversi hasilnya menjadi string sebagai berikut:

"SELECT FirstName FROM Students WHERE DoB >= " & myDate.ToString("d MMM yyyy")

Saya menulis ini karena saya tahu kadang-kadang beberapa programmer mungkin tidak cukup tertarik untuk mendeteksi konversi yang melekat. Tidak akan ada kesalahan untuk tanggal <13, hanya hasil yang berbeda!

Adapun pertanyaan yang diajukan, tambahkan satu hari ke tanggal terakhir dan buat perbandingan sebagai berikut:

dated >= '11 Nov 2016' AND dated < '15 Nov 2016' 
Hannington Mambo
sumber
informasi Anda membantu menyelesaikan tugas saya. Saya telah mengerjakan ini selama lebih dari 10 jam dan tidak ada jawaban yang cocok untuk saya. Ketika saya menggabungkan seperti Anda telah menunjukkan proyek saya berfungsi dengan baik. tapi sepertinya aturannya adalah tidak menulis pernyataan SQL seperti ini. ketika saya mencoba untuk mengatur SqlCommand untuk menambahkan parameter tanggal ke pernyataan SQL parameter tidak akan melampirkan dan saya mendapatkan kesalahan bahwa saya harus menyatakan "@startDate" dan "@endDate". saya tidak bisa melewati masalah ini. Saya mencoba format tanggal Anda "dd MMM yyyy" yang berfungsi dan saya juga mencoba "yyyy MMM dd" yang juga melakukan hal yang sama.
Dave Hampel
Sangat membantu! Di atas adalah contoh kode. Itu selalu lebih baik untuk mendeklarasikan dan menggunakan parameter untuk menghindari SQL Injection. Dan sepertinya Anda sudah diharuskan / dilindungi oleh aturan dalam proyek Anda, yang bagus.
Hannington Mambo
4
select Date,TotalAllowance 
from Calculation 
where EmployeeId=1
  and convert(varchar(10),Date,111) between '2011/02/25' and '2011/02/27'
njtd
sumber
3

Coba letakkan tanggal di antara # # misalnya:

#2013/4/4# and #2013/4/20#

Ini berhasil untuk saya.

Aleksandar
sumber
1
Apa yang dilakukan # dalam konteks ini?
BK
@ BK itu pembatas, seperti tanda kutip untuk string. "Saat memasok nilai ke pernyataan SQL, misalnya sebagai kriteria kueri, tipe datanya harus didefinisikan dengan benar oleh" kualifikasi ". Ini dilakukan dengan melampirkan nilai di antara sepasang karakter yang sesuai." referensi -> tautan
Aleksandar
1
@ BK Jika ini adalah sintaks TSql, Anda harus menggunakan tanda kutip tunggal ( ' ) untuk mendapatkan apa yang Anda butuhkan. referensi * dasar-dasar sql-fontstuff.com * Awal SQL - Paul Wilton, John Colby
Aleksandar
1
Tidak bisa lebih jelas bahwa pertanyaannya adalah untuk SQL Server dan T-SQL. T-SQL dan SQL Server tidak menerima tanggal di antara tag hash, ia menerima tanggal di antara tanda kutip tunggal. Jawaban ini salah.
TT.
@TT. jumlah upvotes mengatakan bahwa itu masih membantu seseorang. Pada saat saya menulis jawaban saya, jawaban yang diterima sudah dipilih. Namun, saya menulis ini untuk membantu siapa saja yang mungkin datang ke sini dari Google atau di tempat lain :)
Aleksandar
2

jika kencannya dalam 24 jam dan dimulai di pagi hari dan berakhir di malam hari harus menambahkan sesuatu seperti:

declare @Approval_date datetime
set @Approval_date =getdate()
Approval_date between @Approval_date +' 00:00:00.000' and @Approval_date +' 23:59:59.999'
Sheryar Nizar
sumber
1

permintaan terbaik untuk tanggal yang dipilih antara tanggal saat ini dan kembali tiga hari :

  select Date,TotalAllowance from Calculation where EmployeeId=1 and Date BETWEEN       
DATE_SUB(CURDATE(), INTERVAL 3 DAY)  AND CURDATE() 

permintaan terbaik untuk tanggal yang dipilih antara tanggal saat ini dan tiga hari berikutnya :

  select Date,TotalAllowance from Calculation where EmployeeId=1 and Date BETWEEN   
   CURDATE()  AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)   
pengguna3223432
sumber
1

Lihat di bawah Contoh: Keduanya berfungsi dan Tidak Bekerja.

select * from tblUser Where    
convert(varchar(10),CreatedDate,111) between '2015/04/01' and '2016/04/01' //--**Working**

ATAU

select * from tblUser Where
(CAST(CreatedDate AS DATETIME) between CAST('2015/04/01' AS DATETIME) And CAST('2016/4/30'AS DATETIME)) //--**Working**

ATAU

select * from tblUser Where
(YEAR(CreatedDate) between YEAR('2015/04/01') And YEAR('2016/4/30')) 
//--**Working**

DAN di bawah ini tidak berfungsi:

select * from tblUser Where
Convert(Varchar(10),CreatedDate,111) >=  Convert(Varchar(10),'01-01-2015',111) and  Convert(Varchar(10),CreatedDate,111) <= Convert(Varchar(10),'31-12-2015',111) //--**Not Working**


select * from tblUser Where
(Convert(Varchar(10),CreatedDate,111) between Convert(Varchar(10),'01-01-2015',111) And Convert(Varchar(10),'31-12-2015',111)) //--**Not Working**
Tobbin Well
sumber
1

kita dapat menggunakan antara untuk menampilkan dua data tanggal tetapi ini akan mencari seluruh data dan membandingkan sehingga akan membuat proses kami lambat untuk data besar, jadi saya sarankan semua orang untuk menggunakan datediff:

qry = "SELECT * FROM [calender] WHERE datediff(day,'" & dt & "',[date])>=0 and datediff(day,'" & dt2 & "',[date])<=0 "

di sini kalender adalah Tabel, dt sebagai variabel tanggal mulai dan dt2 adalah variabel tanggal selesai.

Bipul Roy
sumber
0

Saya suka menggunakan sintaks '1 MonthName 2015' untuk tanggal ex:

   WHERE aa.AuditDate>='1 September 2015'
     AND aa.AuditDate<='30 September 2015'

untuk kencan

Juan
sumber
0

Saya akan pergi untuk

select Date,TotalAllowance from Calculation where EmployeeId=1
             and Date >= '2011/02/25' and Date < DATEADD(d, 1, '2011/02/27')

Logikanya yang >=mencakup seluruh tanggal mulai dan <tidak termasuk tanggal akhir, jadi kami menambahkan satu unit ke tanggal akhir. Ini dapat diadaptasi selama berbulan-bulan, misalnya:

select Date, ... from ...
             where Date >= $start_month_day_1 and Date < DATEADD(m, 1, $end_month_day_1)
entonio
sumber
0
Select 
    * 
from 
    Calculation 
where 
    EmployeeId=1 and Date between #2011/02/25# and #2011/02/27#;
Saad Sheikh
sumber
0

Anda dapat mencoba SQL ini

select * from employee where rec_date between '2017-09-01' and '2017-09-11' 
Kamran
sumber
0

Benar-benar semua tanggal sql harus dalam format yyyy-MM-dd untuk hasil yang paling akurat.

Robert Peter Bronstein
sumber
0
/****** Script for SelectTopNRows command from SSMS  ******/
SELECT TOP 10 [Id]
  ,[Id_parvandeh]
  ,[FirstName]
  ,[LastName]
  ,[RegDate]
  ,[Gilder]
  ,[Nationality]
  ,[Educ]
  ,[PhoneNumber]
  ,[DueInMashhad]

  ,[EzdevajDate]


  ,[MarriageStatus]
  ,[Gender]
  ,[Photo]

  ,[ModifiedOn]
  ,[CreatorIp]
   From
  [dbo].[Socials] where educ >= 3 or EzdevajDate  >= '1992/03/31' and EzdevajDate <= '2019/03/09' and MarriageStatus = 1
Mojtaba Nava
sumber
-2

lebih baik tulis seperti ini:

CREATE PROCEDURE dbo.Get_Data_By_Dates
(
    @EmployeeId INT = 1,
    @Start_Date DATE,
    @End_Date Date
)
AS
Select * FROM Calculation  
    where EmployeeId=@EmployeeId AND Test_Date BETWEEN @Start_Date AND @End_Date
RETURN
Hadi
sumber
1
Menggunakan Prosedur-Tersimpan dalam situasi ini tidak akan masuk akal karena akan sangat mengurangi fleksibilitas query SQL, itu akan sangat spesifik, Jika Anda tidak ingin menggunakannya dalam situasi yang sangat spesifik, jangan gunakan Stored-Procedure - Juga ada banyak perbaikan yang tersedia untuk Stored-Procedure Anda yang dapat Anda temukan di komunitas ini;).
shA.t
-6
SELECT Date, TotalAllowance  
FROM Calculation  
WHERE EmployeeId = 1 
  AND Date BETWEEN to_date('2011/02/25','yyyy-mm-dd') 
               AND to_date ('2011/02/27','yyyy-mm-dd');
Ankita
sumber
1
Anda mungkin berpikir tentang Oracle SQL ketika Anda menulis jawaban ini. Ini berlaku di Oracle. Tidak begitu banyak di SQL Server (dari apa yang bisa saya lihat).
Charles Caldwell