在SQL Server存储过程中验证日期参数

时间:2009-02-11 08:25:57

标签: sql-server validation stored-procedures date

我编写了一个带有日期参数的存储过程。我担心的是AmericanBritish日期格式之间会出现混淆。确保02/12/2008等日期之间不存在歧义的最佳方法是什么。一种可能性是用户以20081202 (yyyymmdd)等格式输入日期。有没有办法在不使用子字符串的情况下验证它?或者,日期可以输入为02-Dec-2008(dd-mmm-yyyy),但再次进行验证并非易事,并且不使用英语的用户可能存在问题。

继前三个答案。 。 。一个问题是我期望在没有前端的情况下直接调用这个存储过程,因此proc的验证不是一个选项。将日,月和年作为单独的参数是一个好主意吗?

6 个答案:

答案 0 :(得分:4)

如果您在sproc中使用参数,则不会有任何问题:

create proc dbo.Sproc
    @date datetime
as
    ...

答案 1 :(得分:4)

如果您将参数声明为DATETIME类型或SQL Server中其他类型的日期/时间类型之一,那么就没有歧义;它代表一个特定的日期和时间。您正在讨论的验证类型应该发生在存储过程之外,而不是在内部。


从您的评论和编辑中确定,问题出现在人们调用SP而不是实际调用SP的方式中。为此,您只需要训练您的用户使用可排序的日期格式,即

yyyy-MM-dd HH:mm:ss

然后没有歧义。任何被允许数据库附近的人都应该知道本地化问题,并且在输入日期时应该始终使用像这样的非模糊格式。

答案 2 :(得分:1)

我最终为该日期采用字符串参数,并要求用户将该月作为单词输入。我通过将输入转换为日期来检查输入是否为有效日期。为确保将月份作为单词输入,我使用like比较器将输入字符串与“%Jan%”或“%Feb%”或“%Mar%”等进行比较。

答案 3 :(得分:0)

如果您的proc接受日期作为日期时间参数,那么您几乎无法验证所需的格式是ddmmyyyy而不是mmddyyyy。这完全取决于用户输入日期的方式以及如何将其传递给SQL。

例如:在网页上我可以添加像这样的参数

command.Parameters.AddWithValue("@mydate",mydateVar.ToString("dd/MM/yyyy"));

OR

command.Parameters.AddWithValue("@mydate",mydateVar.ToString("MM/dd/yyyy"));

只要字符串可以正确地转换为日期,SQL就会插入其给定的内容。它不会知道您想要使用的格式,因此它会尝试强制转换为系统默认格式。

我使用的解决方案虽然可能不适用于您的情况,但是用户可以在dd-MMM-yyyy格式的任何前端输入所有日期。在插入数据库之前,我可以确定格式。我在任何地方都使用这种格式,以便在整个应用程序中保持一致。

答案 4 :(得分:0)

你说你期望直接调用这个存储过程而没有前端,并且proc的验证不是一个选项。

在这种情况下,用户将直接插入数据,我也相信在这种情况下它仅供内部使用(因为存储过程将直接调用)

所以我认为你有两个选择

  1. 如果你有纪律用户,你可以同意其中一个safe formats:ISO yyyyddmm,或ISO8601 yyyy-mm-dd Thh:mm:ss:mmm如果你还需要一个时间部分
  2. 否则需要3个参数:年,月,年并在存储过程中执行一些验证

答案 5 :(得分:0)

我说采用日期时间并训练它们使用日期的ODBC规范形式,如下例所示:

EXECUTE uspMyProc {d '2009-02-11'}

如果您需要解析一个必须解析的日期,无论是字符串还是年,月和日作为单独的整数参数,那么您必须处理月份和年份的超出范围的天数。有些功能会自动推进或向后移动一天。因此,当天发送0并获得上个月的最后一天的技巧。其他人返回错误。但是自己处理这些东西可能不值得重新发明。

如果您必须这样做,因为新手会直接运行它(为什么新手会直接运行存储过程?),我会采用三个单独的参数并将连接日期作为字符串传递,格式为YYYY-MM-DD通过ISDATE验证参数,如果参数无效则退出。