Saya mencoba untuk mengubah tanggal dengan bagian-bagian individual seperti 12, 1, 2007 menjadi datetime di SQL Server 2005. Saya telah mencoba yang berikut ini:
CAST(DATEPART(year, DATE)+'-'+ DATEPART(month, DATE) +'-'+ DATEPART(day, DATE) AS DATETIME)
tetapi ini menghasilkan tanggal yang salah. Apa cara yang benar untuk mengubah nilai tanggal tiga menjadi format datetime yang tepat.
sql
sql-server
sql-server-2005
tsql
Brandon
sumber
sumber
Jawaban:
Anggaplah
y, m, d
semuanyaint
, bagaimana dengan:Silakan lihat jawaban saya yang lain untuk SQL Server 2012 dan di atas
sumber
yyyymmdd
Format bekerja terlepas dari pengaturan tersebut. "String enam atau delapan digit selalu ditafsirkan sebagai ymd ." docs.microsoft.com/en-us/sql/t-sql/data-types/… Lihat jawaban ini: stackoverflow.com/a/46064419/2266979Coba ini:
Ini berfungsi juga, telah menambahkan manfaat dari tidak melakukan konversi string, jadi ini adalah proses aritmatika murni (sangat cepat) dan tidak tergantung pada format tanggal apa pun. Ini memanfaatkan fakta bahwa representasi internal SQL Server untuk nilai datetime dan smalldatetime adalah dua. bagian nilai bagian pertama yang merupakan bilangan bulat yang mewakili jumlah hari sejak 1 Jan 1900, dan bagian kedua adalah pecahan desimal yang mewakili bagian fraksional satu hari (untuk saat itu) --- Jadi nilai bilangan bulat 0 (nol ) selalu diterjemahkan langsung ke Tengah malam pada tanggal 1 Jan 1900 ...
atau, terima kasih atas saran dari @brinary,
Diedit Oktober 2014. Seperti yang Dicatat oleh @cade Roux, SQL 2012 sekarang memiliki fungsi bawaan:
DATEFROMPARTS(year, month, day)
melakukan hal yang sama.
Diedit 3 Okt 2016, (Terima kasih kepada @bambams karena memperhatikan ini, dan @brinary untuk memperbaikinya), Solusi terakhir, diusulkan oleh @brinary. tampaknya tidak berfungsi selama tahun kabisat kecuali penambahan tahun dilakukan pertama kali
sumber
@Year = 2001
, misalnya ,@Month = 13
dan@DayOfMonth = 32
menghasilkan2002-02-01T00:00:00.000
. Jawaban yang diterima (oleh Cade Roux) menghasilkan kesalahan, yang lebih berguna.SQL Server 2012 memiliki fungsi DATEFROMPARTS baru yang luar biasa dan telah lama ditunggu-tunggu (yang akan memunculkan kesalahan jika tanggal tidak valid - keberatan utama saya terhadap solusi berbasis DATEADD untuk masalah ini):
http://msdn.microsoft.com/en-us/library/hh213228.aspx
atau
sumber
Atau hanya menggunakan fungsi dateadd tunggal:
sumber
Sql Server 2012 memiliki fungsi yang akan membuat tanggal berdasarkan pada bagian-bagian ( DATEFROMPARTS ). Bagi kita semua, berikut adalah fungsi db yang saya buat yang akan menentukan tanggal dari bagian-bagian (terima kasih @Charles) ...
Anda bisa menyebutnya seperti ini ...
Kembali ...
sumber
Coba CONVERT, bukan CAST.
CONVERT memungkinkan parameter ketiga yang menunjukkan format tanggal.
Daftar format ada di sini: http://msdn.microsoft.com/en-us/library/ms187928.aspx
Perbarui setelah jawaban lain dipilih sebagai jawaban "benar":
Saya tidak benar-benar mengerti mengapa jawaban dipilih yang jelas tergantung pada pengaturan NLS di server Anda, tanpa menunjukkan batasan ini.
sumber
Anda juga bisa menggunakan
Bekerja di SQL sejak ver.2012 dan AzureSQL
sumber
Lebih aman dan lebih rapi untuk menggunakan titik awal eksplisit '19000101'
sumber
declare @output datetime2 = 0
dan alih-alih@Year - 1900
digunakan@Year - DATEPART(year,0);
? Ini berfungsi tanpa gips dalam SQL Server 2008 dan jauh lebih jelas.Jika Anda tidak ingin menghilangkan string, ini juga berfungsi (Masukkan fungsi):
sumber
Saya menambahkan solusi satu baris jika Anda memerlukan datetime dari bagian tanggal dan waktu :
sumber
Mencoba
sumber
Untuk versi SQL Server di bawah 12 saya dapat merekomendasikan penggunaan
CAST
dalam kombinasi denganSET DATEFORMAT
bagaimana Anda membuat string itu terserah Anda
sumber
Coba kueri ini:
Hasil:
sumber
Saya tahu OP meminta jawaban SQL 2005 tetapi pertanyaannya cukup lama sehingga jika Anda menjalankan SQL 2012 atau lebih, Anda dapat menggunakan yang berikut:
Referensi: https://docs.microsoft.com/en-us/sql/t-sql/functions/eomonth-transact-sql?view=sql-server-2017&viewFallbackFrom=sql-server-previousversions
sumber
Saya pribadi lebih suka Substring karena memberikan opsi pembersihan dan kemampuan untuk membagi string yang diperlukan. Asumsinya adalah bahwa data tersebut dalam format 'dd, mm, yyyy'.
Berikut ini adalah demonstrasi bagaimana dapat digugat jika data disimpan dalam kolom. Tidak perlu dikatakan, ideal untuk memeriksa set-hasil sebelum menerapkan ke kolom
sumber