【问题标题】:How to make conversions from varchar to datetime deterministic?如何确定从 varchar 到 datetime 的转换?
【发布时间】:2010-09-23 12:44:47
【问题描述】:

按照this question 的传统和the documentation,如何使这个函数具有确定性:

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

【问题讨论】:

    标签: sql sql-server sql-server-2005 user-defined-functions deterministic


    【解决方案1】:

    BOL 表示 CONVERT 如果指定了 style 参数,则它与日期时间具有确定性。因此,如果您将第一个 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 在 cmets 中指出的那样(谢谢,Arvo),可以使用 ODBC 时间戳文字格式(即使在使用 OLE DB 时),因此上面的第二个函数可以更好地写为:

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

    并且到日期时间的转换是在编译时而不是执行时完成的。请注意,日期的格式必须非常具体(参见Arvo's link to the datetime data type):

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

    【讨论】:

    • 我只在转换为 varchar 时使用过该样式 - 文档有点模棱两可,但我已经尝试过了,它显然有效。
    • @P Daddy,关于日期时间文字的阿门。
    • 关于日期时间文字 - 你不能使用像 { d '1990-10-02' } 这样的 ODBC 时间戳格式吗?来自msdn.microsoft.com/en-us/library/ms187819.aspx:使用 ADO、OLE DB 和基于 ODBC 的 API 的应用程序可以使用这种 ODBC 时间戳格式来表示日期和时间。
    【解决方案2】:

    来自您链接的文章:

    为了具有确定性,样式参数必须是常量。此外,小于或等于 100 的样式是不确定的,除了样式 20 和 21。大于 100 的样式是确定的,除了样式 106、107、109 和 113。

    您需要在转换为日期时间时使用样式参数。

    例如:

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

    除了不使用 121...

    【讨论】:

    • 所以没有文字日期作为 UDF 中的字符串而不被转换?
    • 如果字符串被隐式转换为日期,那么这些转换缺少“常量”样式并且会使函数不确定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2014-01-04
    • 2010-09-09
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多