在将其插入SQL Server数据库之前验证DateTime

Mic*_*ssa 22 c# validation datetime varchar sql-server-2008

datetime在将字段插入适当的表之前,有没有办法验证字段?

尝试使用try/catch块插入不是一种方法.

谢谢,

bil*_*nkc 31

不确定我是否过于迂腐,但DateTime.TryParse将验证值是否是有效的DateTime对象.OP询问在插入SQL Server datetime之前验证值.SQL Server 日期时间的可接受值范围是"1753年1月1日到9999年12月31日".这对于DateTime .NET对象不适用.此脚本将值"1/1/0001 12:00:00 AM"分配给badDateTime并成功解析.

DateTime d = DateTime.MinValue;
string badDateTime = DateTime.MinValue.ToString();
Console.WriteLine(badDateTime);
DateTime.TryParse(badDateTime, out d);
Run Code Online (Sandbox Code Playgroud)

但是,如果您尝试将其存储到日期时间字段中,则会失败并显示"将varchar数据类型转换为日期时间数据类型会导致超出范围的值".

一位评论者问为什么我使用997毫秒,这包含在SQL Server 2008和毫秒之内但是省去了一次点击,997是你可以存储在datetime数据类型中的最大值.998将以000毫秒向上舍入到1秒

    /// <summary>
    /// An initial pass at a method to verify whether a value is 
    /// kosher for SQL Server datetime
    /// </summary>
    /// <param name="someval">A date string that may parse</param>
    /// <returns>true if the parameter is valid for SQL Sever datetime</returns>
    static bool IsValidSqlDatetime(string someval)
    {
        bool valid = false;
        DateTime testDate = DateTime.MinValue;
        DateTime minDateTime = DateTime.MaxValue;
        DateTime maxDateTime = DateTime.MinValue;

        minDateTime = new DateTime(1753, 1, 1);
        maxDateTime = new DateTime(9999, 12, 31, 23, 59, 59, 997);

        if (DateTime.TryParse(someval, out testDate))
        {
            if (testDate >= minDateTime && testDate <= maxDateTime)
            {
                valid = true;
            }
        }

        return valid;
    }
Run Code Online (Sandbox Code Playgroud)

这可能是一种更好的方法,因为这会尝试将DateTime对象转换为实际的sql datetime数据类型


    /// <summary>
    /// An better method to verify whether a value is 
    /// kosher for SQL Server datetime. This uses the native library
    /// for checking range values
    /// </summary>
    /// <param name="someval">A date string that may parse</param>
    /// <returns>true if the parameter is valid for SQL Sever datetime</returns>
    static bool IsValidSqlDateTimeNative(string someval)
    {
        bool valid = false;
        DateTime testDate = DateTime.MinValue;
        System.Data.SqlTypes.SqlDateTime sdt;
        if (DateTime.TryParse(someval, out testDate))
        {
            try
            {
                // take advantage of the native conversion
                sdt = new System.Data.SqlTypes.SqlDateTime(testDate);
                valid = true;
            }
            catch (System.Data.SqlTypes.SqlTypeException ex)
            {

                // no need to do anything, this is the expected out of range error
            }
        }

        return valid;
    }
Run Code Online (Sandbox Code Playgroud)


Ank*_*kar 17

试试这个没有硬编码sql dateTime值:

    public bool IsValidSqlDateTime(DateTime? dateTime)
    {
        if (dateTime == null) return true;

        DateTime minValue = DateTime.Parse(System.Data.SqlTypes.SqlDateTime.MinValue.ToString());
        DateTime maxValue = DateTime.Parse(System.Data.SqlTypes.SqlDateTime.MaxValue.ToString());

        if (minValue > dateTime.Value || maxValue < dateTime.Value)
            return false;

        return true;
    }
Run Code Online (Sandbox Code Playgroud)

  • 您还可以使用在SqlDateTime结构上定义的显式强制转换运算符; 而不是解析字符串表示:`var minValue =(DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;` (4认同)