Saya berasumsi bahwa RValues
adalah kolom string dari beberapa jenis, untuk beberapa alasan. Anda harus memperbaikinya dan menyimpan data tanggal menggunakan tipe data tanggal (jelas di kolom terpisah dari tas campuran ini).
Jika Anda tidak dapat memperbaikinya, maka Anda dapat mencegah apa yang dijelaskan Damien di atas dengan:
CASE WHEN ISDATE(RValues) = 1 THEN CONVERT(Date, RValues) END AS FechaFirma
(Yang akan membuat "tanggal" NULL
jika SQL Server tidak tahu cara mengubahnya menjadi tanggal.)
Anda tidak dapat mencegahnya hanya dengan menambahkan WHERE
klausa, karena SQL Server akan sering mencoba untuk mencoba konversi di SELECT
daftar sebelum melakukan filter (semua tergantung pada rencana). Anda juga tidak dapat memaksakan urutan operasi dengan menggunakan subquery, CTE, petunjuk urutan bergabung, dll. Ada item Connect terbuka tentang masalah ini - mereka "menyadarinya" dan "berharap untuk mengatasinya di versi mendatang
."
Singkat dari ekspresi CASE, yang memaksa SQL Server untuk mengevaluasi hasil ISDATE() sebelum mencoba mengonversi (selama tidak ada agregat di salah satu cabang ), Anda dapat:
- buang hasil yang difilter ke tabel #temp, lalu pilih dari tabel #temp itu, dan hanya terapkan konversi saat itu.
- kembalikan saja string tersebut, dan perlakukan sebagai tanggal pada klien, dan tarik bagian TAHUN/BULAN dll. dari sana
- gunakan manipulasi string untuk menarik YEAR =LEFT(col,4) dll.
-
gunakan
TRY_CONVERT()
karena saya baru tahu Anda menggunakan SQL Server 2012:TRY_CONVERT(DATE, RValues) AS FechaFirma