سؤال

يجب إجراء مخزن الذي ويأخذ معلمة varchar الذي يحتاج إلى أن يلقي كما التاريخ والوقت لاستخدامها في وقت لاحق:

SET @the_date = CAST(@date_string AS DATETIME)

أنا أتوقع سلسلة التاريخ توفيره في شكل "DD-MON-YYYY", ولكن في محاولة رمز دفاعيا ، إذا لسبب ما لا يمكن أن يلقي بنجاح ، أريد الافتراضي إلى تاريخ النظام والاستمرار.في PL/SQL يمكنني استخدام معالجة استثناء لتحقيق هذا وأنا يمكن أن تفعل هذا بسهولة إلى حد ما مع التعبيرات العادية أيضا ، ولكن محدودة نمط مطابقة معتمدة من خارج منطقة الجزاء عن طريق Sybase لا اسمحوا لي أن تفعل هذا وأنا لا يمكن الاعتماد على طرف ثالث المكتبات أو امتداد.هناك طريقة بسيطة للقيام بذلك في T-SQL ؟

ملحوظة::باستخدام Sybase ASE 12.5.3 لا يوجد الدالة ISDATE

هل كانت مفيدة؟

المحلول

أنا أعاني من مشكلة مشابهة.كنت قد تكون قادرة على القيام بشيء من هذا القبيل:

SET arithabort arith_overflow off
SET @the_date = CAST(@date_string AS DATETIME)
IF @the_date is NULL
    set @the_date = getdate()
SET arithabort arith_overflow on

إلا أن هذا لا يعمل بشكل جيد في تحديد.وسوف تعمل بشكل جيد في المؤشر (بو) أو في المنطق قبل / بعد SQL دفعة واحدة.

نصائح أخرى

يا إلهي, إذا كان السؤال عن Microsoft SQL Server ثم كنا في الأعمال التجارية!

Sybase, للأسف, هو معتمة على قاعدة البيانات هذه الأيام منذ عام 1997 في الواقع أو في السنة.

إذا كان الإدخال شكل ببساطة يجب أن يكون 'DD-MON-YYYY' ولا استثناءات ، ثم أعتقد أن قدرا كبيرا من التحقق من صحة هو أن يتحقق من خلال تشريح الإدخال باستخدام SUBSTR () بعد أن تفعل بعض الأشياء البسيطة مثل فحص طول.

ظننت أن الإصدارات الأخيرة من Sybase (SQL في أي مكان 11 ، على سبيل المثال) قد دعم التعبير العادية ، ومع ذلك ، على الرغم من أنها كانت فترة من الوقت منذ ان كنت تعاني T-SQL.بعض غوغلينغ يترك لي في أكثر بدلا شك.

يبدو أنك ستكون عالقة المتداول الخاصة بك.

ربما يمكن استخدام هذا كنقطة انطلاق.

لا يمكن أن تفعل شيئا مثل هذا:

SELECT @the_date = CASE @date_string
                      WHEN '[0-9][0-9]-[A-Z][A-Z][A-Z]-[0-9][0-9][0-9][0-9]'
                      THEN CONVERT(datetime, @date_string)
                      ELSE GETDATE()
                   END

?

وجدت هذا في النتيجة الثانية في جوجل عند البحث عن "التحقق من صحة سلسلة التاريخ sql".

----Invalid date
SELECT ISDATE('30/2/2007')
RETURNS : 0 (Zero)
----Valid date
SELECT ISDATE('12/12/20007')
RETURNS : 1 (ONE)
----Invalid DataType
SELECT ISDATE('SQL')
RETURNS : 0 (Zero)

تأكد من SQL Server يعرف ترتيب الأيام والشهور والسنوات في سلسلة الخاص بك عن طريق تنفيذ

SET DATEFORMAT mdy;

هل حاولت convert بدلا من cast?

select convert( datetime , @date_string ) 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top