Pertanyaan Dapatkan baris di mana kolom datetime = hari ini - noob server SQL


Di sql 2005, alih-alih membuat kueri dari dateparts tahun, bulan dan tanggal,

apakah ada cara penulisan yang lebih ringkas di mana klausa?


35
2018-04-06 07:14


asal


Jawaban:


Di SQL 2000 dan SQL 2005 Anda dapat menggunakan pernyataan pilih yang bagus untuk menghapus komponen waktu dari DateTime, yaitu

SELECT DATEADD(dd, DATEDIFF(dd,0,GETDATE()), 0)

akan mengembalikan 6-Apr-2010 (baik untuk hari ini saja).

Jadi dikombinasikan dengan jawaban marc_s, Anda mau

SELECT (list of fields)
FROM dbo.YourTable
WHERE dateValue BETWEEN DATEADD(dd, DATEDIFF(dd,0,'MY Date and Time, But I Only Want Date'), 0) 
AND DATEADD(dd, DATEDIFF(dd,0,'MY Date and Time, But I Only Want Date'), 1)

Edit: Berubah sesuai dengan persyaratan, perhatikan 1 di DateDd kedua (ini menambahkan hari-hari dari awal menjadi 1 (bukan 0), sehingga 7 April 2010 00:00:00) Jika Anda ingin 6 Apr 23:59:59 Anda mengambil kedua dari tanggal kedua

DATEADD(ss,-1,'My DateTime')

Panggilan Terakhir akan menjadi

DATEADD(ss,-1,DATEADD(dd, DATEDIFF(dd,0,'MY Date and Time, But I Only Want Date'), 1))

Ok itu banyak info sekaligus! Semoga semuanya masuk akal :)


22
2018-04-06 07:24



Pada SQL Server 2008, Anda akan memiliki yang baru DATE tipe data, yang dapat Anda gunakan untuk mencapai ini:

SELECT (list of fields)
FROM dbo.YourTable
WHERE dateValue BETWEEN 
   CAST(GETDATE() AS DATE) AND DATEADD(DAY, 1, CAST(GETDATE() AS DATE))

Itu CAST(GETDATE() AS DATE) mentransmisikan tanggal dan waktu saat ini ke nilai tanggal saja, mis. kembalikan '2010-04-06' untuk 6 April 2010. Menambah satu hari untuk itu pada dasarnya memilih semua nilai datetime hari ini.

Di SQL Server 2005, tidak ada cara mudah untuk melakukan ini - solusi paling elegan Saya temukan di sini menggunakan manipulasi numerik DATETIME untuk mencapai hasil yang sama:

SELECT (list of fields)
FROM dbo.YourTable
WHERE dateValue BETWEEN 
   CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME) AND 
   DATEADD(DAY, 1, CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME))

26
2018-04-06 07:17



Bukan kinerja yang baik, tetapi solusinya:

SELECT * 
FROM tblDate
WHERE CONVERT(VARCHAR, date, 112) = CONVERT(VARCHAR, GETDATE(), 112);

Jika itu adalah kueri umum, kolom yang dihitung harus ditambahkan hanya dengan konten tahun-bulan-hari.


4
2018-04-06 07:27



Sesuatu di sepanjang garis ini

CONVERT(date,tbldata.date)=CONVERT(date,getdate())

Ini mengasumsikan bahwa kolom tanggal termasuk waktu juga. Jika tidak maka Anda dapat mengubahnya menjadi

tbldata.date=CONVERT(date,getdate())

1
2018-04-06 07:23



Saya telah menggunakan UDF untuk melakukan ini pada kolom datetime kembali ke SQL 2000.

CREATE FUNCTION [dbo].[GETDATENOTIME](@now datetime)
RETURNS smalldatetime
AS
BEGIN
    RETURN (CONVERT(smalldatetime, CONVERT(varchar, @now, 112)))
END

Pemakaian:

DECLARE @date smalldatetime
SET @date = '4/1/10'
SELECT * FROM mytable WHERE dbo.GETDATENOTIME(date) = @date

Bukan hal yang paling efisien di dunia (YMMV tergantung pada meja Anda) tetapi itu melakukan pekerjaan. Untuk tabel di mana saya tahu saya akan memilih berdasarkan tanggal-tanpa-waktu banyak, saya akan memiliki kolom khusus untuk itu dengan set default ke dbo.GETDATENOTIME (GETDATE ()).


0
2018-04-06 07:46