Saya ingin mengonversi string seperti ini:
'10/15/2008 10:06:32 PM'
ke dalam nilai DATETIME yang setara di Sql Server.
Di Oracle, saya akan mengatakan ini:
TO_DATE('10/15/2008 10:06:32 PM','MM/DD/YYYY HH:MI:SS AM')
Pertanyaan ini menyiratkan bahwa saya harus mengurai string ke salah satu format standar , dan kemudian mengonversi menggunakan salah satu kode itu. Itu tampak menggelikan untuk operasi duniawi seperti itu. Apakah ada cara yang lebih mudah?
sql-server
tsql
datetime
sql-server-2005
string-to-datetime
JosephStyons
sumber
sumber
Jawaban:
SQL Server (2005, 2000, 7.0) tidak memiliki cara yang fleksibel, atau bahkan tidak fleksibel, untuk mengambil datetime yang terstruktur secara sewenang-wenang dalam format string dan mengubahnya menjadi tipe data datetime.
Dengan "sewenang-wenang", maksud saya "bentuk yang orang yang menulisnya, meskipun mungkin bukan Anda atau saya atau seseorang di sisi lain planet ini, akan dianggap sebagai intuitif dan sangat jelas." Terus terang, saya tidak yakin ada algoritma seperti itu.
sumber
9/6/12
berarti 6 September 2012, 9 Juni 2012, 6 Desember 2009, atau yang lainnya?Coba ini
dan
Lihat CAST dan CONVERT (Transact-SQL) untuk lebih jelasnya.
sumber
Cast('2011-07-07' as datetime)
juga berfungsi, dan menghilangkan ambiguitas dalam urutan bulan dan hari.SET DATEFORMAT dmy
sebelum permintaan AndaJalankan ini melalui prosesor kueri Anda. Ini memformat tanggal dan / atau waktu seperti itu dan salah satunya akan memberi Anda apa yang Anda cari. Tidak akan sulit untuk beradaptasi:
sumber
Di SQL Server Denali, Anda akan dapat melakukan sesuatu yang mendekati apa yang Anda cari. Tapi Anda masih tidak bisa hanya melewatkan string tanggal aneh yang ditentukan sewenang-wenang dan mengharapkan SQL Server untuk mengakomodasi. Ini adalah salah satu contoh menggunakan sesuatu yang Anda posting dalam jawaban Anda sendiri. FORMAT () berfungsi dan juga dapat menerima lokal sebagai argumen opsional - didasarkan pada format .Net, jadi sebagian besar jika tidak semua format token yang Anda harapkan akan ada di sana.
Saya sangat menyarankan Anda untuk mengambil kendali lebih besar dan membersihkan input tanggal Anda. Hari-hari membiarkan orang mengetik tanggal menggunakan format apa pun yang mereka inginkan ke dalam bidang bentuk teks bebas harus jauh di belakang kita sekarang. Jika seseorang masuk 8/9/2011 apakah itu 9 Agustus atau 8 September? Jika Anda membuat mereka memilih tanggal pada kontrol kalender, maka aplikasi dapat mengontrol format. Tidak peduli seberapa banyak Anda mencoba untuk memprediksi perilaku pengguna Anda, mereka akan selalu mencari cara bodoh untuk memasukkan tanggal yang tidak Anda rencanakan.
Sampai Denali, saya pikir @Ovidiu memiliki saran terbaik sejauh ini ... ini dapat dibuat cukup sepele dengan menerapkan fungsi CLR Anda sendiri. Kemudian Anda dapat menulis case / switch sebanyak mungkin format non-standar yang Anda inginkan.
UPDATE untuk @dhergert :
Hasil:
Anda masih perlu memiliki informasi penting lainnya terlebih dahulu. Anda tidak dapat menggunakan T-SQL asli untuk menentukan apakah
6/9/2012
tanggal 9 Juni atau 6 September.sumber
Untuk masalah ini solusi terbaik yang saya gunakan adalah memiliki fungsi CLR di Sql Server 2005 yang menggunakan salah satu fungsi DateTime.Parse atau ParseExact untuk mengembalikan nilai DateTime dengan format yang ditentukan.
sumber
Gunakan ini:
Dan lihat tabel dalam dokumentasi resmi untuk kode konversi.
sumber
kenapa tidak mencoba
format tanggal dapat ditemukan di SQL Server Helper> Format Tanggal SQL Server
sumber
select convert(date,'10/15/2011 00:00:00',101)
. Rincian lebih lanjut tentang format dan mengapa 101, di docs.microsoft.com/en-us/sql/t-sql/functions/…Butuh waktu sebentar untuk mencari tahu, jadi ini dia kalau-kalau bisa membantu seseorang:
Di SQL Server 2012 dan lebih baik Anda dapat menggunakan fungsi ini:
Inilah cara saya mengekstraksi bagian tanggal untuk dimasukkan ke dalam fungsi ini:
sumber
Halaman ini memiliki beberapa referensi untuk semua konversi datetime tertentu yang tersedia untuk fungsi CONVERT. Jika nilai Anda tidak jatuh ke dalam salah satu pola yang dapat diterima, maka saya pikir yang terbaik adalah pergi dengan rute ParseExact.
sumber
Secara pribadi jika Anda berurusan dengan format dinding yang sewenang-wenang atau sepenuhnya, asalkan Anda tahu apa yang mereka lakukan sebelumnya atau yang akan terjadi maka cukup gunakan regexp untuk menarik bagian tanggal yang Anda inginkan dan membentuk komponen tanggal / datetime yang valid.
sumber
Saya tahu ini adalah posting lama yang jahat dengan banyak jawaban tetapi banyak orang berpikir bahwa mereka PERLU untuk memisahkan hal-hal dan menyatukannya kembali atau mereka bersikeras bahwa tidak ada cara untuk secara implisit melakukan konversi yang diminta oleh OP asli. .
Untuk meninjau dan berharap memberikan jawaban yang mudah kepada orang lain dengan pertanyaan yang sama, OP bertanya bagaimana mengkonversi '10 / 15/2008 10:06:32 PM 'menjadi DATETIME. Sekarang, SQL Server memang memiliki beberapa dependensi bahasa untuk konversi sementara tetapi jika bahasanya adalah bahasa Inggris atau yang serupa, ini menjadi masalah sederhana ... lakukan saja konversi dan jangan khawatir tentang formatnya. Misalnya (dan Anda dapat menggunakan CONVERT atau CAST) ...
... dan itu menghasilkan jawaban ikuti, yang keduanya benar.
Seperti yang mereka katakan di iklan TV, "Tapi tunggu! Jangan pesan dulu! Tanpa biaya tambahan, itu bisa melakukan JAUH lebih banyak!"
Mari kita lihat kekuatan konversi temporal yang sebenarnya dengan DATETIME dan sebagian memeriksa kesalahan yang dikenal sebagai DATETIME2. Lihat format aneh yang DATETIME dapat tangani secara ajaib dan DATETIME2 tidak bisa. Jalankan kode berikut dan lihat ...
Jadi, ya ... SQL Server TIDAK benar-benar memiliki metode yang cukup fleksibel dalam menangani semua jenis format temporal yang aneh dan tidak perlu penanganan khusus. Kami bahkan tidak perlu menghapus "PM" yang ditambahkan ke waktu 24 jam. Ini "PFM" (Sihir Freakin Murni).
Hal-hal akan sedikit berbeda tergantung pada BAHASA adalah bahwa Anda telah memilih untuk server Anda, tetapi banyak hal akan ditangani dengan cara baik.
Dan konversi "sihir otomatis" ini bukanlah sesuatu yang baru. Mereka sangat jauh ke belakang.
sumber
Jika Anda ingin SQL Server mencoba dan mengetahuinya, gunakan saja CAST CAST ('apapun' AS datetime) Namun itu adalah ide yang buruk secara umum. Ada masalah dengan tanggal internasional yang akan muncul. Jadi seperti yang Anda temukan, untuk menghindari masalah itu, Anda ingin menggunakan format kanonik ODBC tanggal. Itu adalah format angka 120, 20 adalah format hanya untuk dua digit tahun. Saya tidak berpikir SQL Server memiliki fungsi built-in yang memungkinkan Anda untuk memberikan format yang diberikan pengguna. Anda dapat menulis sendiri dan bahkan mungkin menemukannya jika Anda mencari secara online.
sumber
mengkonversi string ke datetime di MSSQL secara implisit
sumber
sumber