سؤال

في تقليد هذا السؤال و في ضوء الوثائق, كيف تجعل هذه الوظيفة القطعية:

ALTER FUNCTION [udf_DateTimeFromDataDtID]
(
    @DATA_DT_ID int -- In form YYYYMMDD
)
RETURNS datetime
WITH SCHEMABINDING
AS
BEGIN
    RETURN CONVERT(datetime, CONVERT(varchar, @DATA_DT_ID))
END

أو هذا (بسبب سلسلة/تاريخ حرفية - نعم, لقد حاولت أيضا '1900-01-01'):

ALTER FUNCTION udf_CappedDate
(
    @DateTimeIn datetime
)
RETURNS datetime
WITH SCHEMABINDING
AS
BEGIN
    IF @DateTimeIn < '1/1/1900'
        RETURN '1/1/1900'
    ELSE IF @DateTimeIn > '1/1/2100'
        RETURN '1/1/2100'

    RETURN @DateTimeIn
END
هل كانت مفيدة؟

المحلول

بول يقول أن CONVERT هو القطعية مع datetimes إذا نمط المعلمة المحددة.حتى إذا قمت بتغيير أول UDF إلى:

RETURN CONVERT(datetime, CONVERT(varchar, @DATA_DT_ID), 112)

ثم يجب أن يكون القطعية ، إذا فهمت المستندات بشكل صحيح.

ويفترض نفس الخدعة يمكن أن تستخدم في الثانية UDF:

IF @DateTimeIn < CONVERT(datetime, '1/1/1900', 101)
    RETURN CONVERT(datetime, '1/1/1900', 101)

أنا حقا أتمنى لو كانت هناك طريقة تحديد التاريخ والوقت حرفية في T-SQL.

تحرير:

كما أشار Arvo في التعليقات (شكرا لك, Arvo) ، ODBC الزمني الحرفي الشكل يمكن استخدامها (حتى عند استخدام موفر OLE DB) وبالتالي فإن الوظيفة الثانية أعلاه يمكن أن يكون أفضل كما هو مكتوب:

IF @DateTimeIn < {d '1900-01-01'}
    RETURN {d '1900-01-01'}
...etc.

وتحويل التاريخ والوقت يتم في وقت التحويل البرمجي بدلا من وقت التنفيذ.لاحظ أن تنسيق التاريخ يجب أن تكون محددة للغاية (انظر Arvo وصلة إلى نوع البيانات التاريخ والوقت):

د yyyy-mm-dd
t hh:mm:ss[.fff]
ts yyyy-mm-dd hh:mm:ss[.fff]

نصائح أخرى

من المواد المرتبطة:

أن يكون محددا ، وأسلوب المعلمة يجب أن تكون ثابتة.بالإضافة إلى أساليب أقل من أو يساوي 100 غير حتمى ، باستثناء الأساليب 20 و 21.أنماط أكبر من 100 القطعية ، باستثناء الأساليب 106, 107, 109 113.

تحتاج إلى استخدام أسلوب المعلمة في التحويلات الخاصة بك إلى التاريخ والوقت.

على سبيل المثال:

CONVERT(datetime, '2008-01-01', 121)

إلا لا تستخدم 121...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top