Diberikan komponen-komponen berikut
DECLARE @D DATE = '2013-10-13'
DECLARE @T TIME(7) = '23:59:59.9999999'
Apa cara terbaik menggabungkan mereka untuk menghasilkan DATETIME2(7)
hasil dengan nilai '2013-10-13 23:59:59.9999999'
?
Beberapa hal yang tidak berfungsi tercantum di bawah ini.
SELECT @D + @T
Operan tanggal tipe data tidak valid untuk operator tambahan.
SELECT CAST(@D AS DATETIME2(7)) + @T
Operand tipe data datetime2 tidak valid untuk operator tambahan.
SELECT DATEADD(NANOSECOND,DATEDIFF(NANOSECOND,CAST('00:00:00.0000000' AS TIME),@T),@D)
Fungsi Dateiff mengakibatkan overflow. Jumlah suku cadang yang memisahkan dua instance tanggal / waktu terlalu besar. Cobalah menggunakan Dateiff dengan bagian data yang kurang tepat.
* Overflow dapat dihindari di Azure SQL Database dan SQL Server 2016, menggunakan DATEDIFF_BIG
.
SELECT CAST(@D AS DATETIME) + @T
Tipe data datetime dan waktu tidak kompatibel di add operator.
SELECT CAST(@D AS DATETIME) + CAST(@T AS DATETIME)
Mengembalikan hasil tetapi kehilangan presisi
2013-10-13 23:59:59.997
Untuk SQL Server 2012 dan di atasnya ada fungsi DATETIME2FROMPARTS . Ini memiliki bentuk ini:
Untuk data sampel yang diberikan ini menjadi
yang mengakibatkan
Bagian dapat diperoleh dengan menggunakan DATEPART () jika dimulai dari tipe data temporal, atau dari teks yang digunakan untuk membangun nilai sampel dalam pertanyaan.
sumber
Ini cukup bodoh dari SQL Server untuk tidak membiarkan contoh pertama Anda bekerja, dan ini akan tampak sangat bodoh juga, tapi ...
sumber
sumber
Saya sedang mencari sesuatu yang lain ketika saya mendarat di sini. Pertanyaannya cukup lama, tetapi ada beberapa komentar dan aktivitas terbaru. Saya pikir saya akan membagikan metode sederhana yang sangat mirip dengan jawaban yang diberikan @Atario, tetapi sedikit lebih pendek dan beberapa mungkin akan lebih mudah dibaca:
sumber
Anda dapat memotong gips dengan DATE untuk memotong, lalu kembali ke DATETIME untuk menambahkan TIME
sumber