在使用数据库更新脚本发布的sql语句中设置文化中立日期

时间:2016-01-20 09:07:45

标签: sql sql-server

我目前正在为数据库创建和测试更新脚本,该数据库将包含在我创建的程序的安装例程中。在数据库中,我创建了一个名为DatabaseVersionHistory的简单独立表,我的计划是在每次更新时都包含这些内容(我不打算进行大量更新但是意识到奇怪的更新是不可避免的,并且考虑到它们将是累积的,以正确的顺序安装它们至关重要。

所以对我的问题;

采取此脚本

 UPDATE DatabaseVersionHistory
  SET VersionNumber =1.1,
  ReleaseDate = '20/01/2016',
  ReleasedWithFTVersion = 1.01

撰写ReleaseDate =的正确方法是什么,以便它能以文化中立的方式运作?

我接受这一点可以说,鉴于我正在设定一个特定的版本号,该日期是学术性的,但我希望它在那里容易以文化中立的方式设置。

问题的下一部分涉及未来的更新和最佳方法的问题。是否应该只有一个更新脚本,对版本号进行测试,然后使用case语句运行以使最终用户的数据库达到正确版本或让最终用户运行一系列脚本数据库达到正确的版本。我的计划是在安装程序中将所有内容自动化,因此没有任何修复,我想从一开始就尝试采用最佳实践。

我故意将此标记为SqlServer,因为第二部分有一般性方面。实际上,它可能以标准或快速变体为目标,以SqlServer 2012或更高版本为目标。

1 个答案:

答案 0 :(得分:2)

Aaron Bertrand在他的文章Bad habits to kick : mis-handling date / range queries中写道:

  

SQL Server中日期/时间文字的唯一真正安全格式,at   至少DATETIME和SMALLDATETIME是:

YYYYMMDD
YYYY-MM-DDThh:mm:ss[.nnn]
     

...

     

作为一个例子,即使你试图使用看似毫不含糊的   YYYY-MM-DD,这可能会在某些情况下中断 - 例如   用户的语言设置设置为法语。

     

...

     

YYYY-MM-DD相反,YYYYMMDD永远不会破坏。

因此,对于SQL Server中的YYYY-MM-DD类型,datetime 安全。使用YYYYMMDD

您的查询应如下所示:

UPDATE DatabaseVersionHistory
SET 
    VersionNumber = 1.1,
    ReleaseDate = '20160120',
    ReleasedWithFTVersion = 1.01