كيفية جعل التحويلات من varchar إلى التاريخ والوقت القطعية?
-
08-07-2019 - |
سؤال
في تقليد هذا السؤال و في ضوء الوثائق, كيف تجعل هذه الوظيفة القطعية:
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...