在SQL Server和VB.Net之间使用一致的日期时间格式的最佳方法

cod*_*GEN 6 vb.net sql-server datetime datetime-format

我正在开发一个VB.Net应用程序,该应用程序的操作严重依赖于日期和时间.如果应用程序日期格式与服务器日期格式不匹配,则日期格式可能存在冲突,解决此问题的最佳做法是什么.我知道SQL Server datetime格式依赖于服务器语言而VB.Net将使用本地机器的datetime格式.这意味着如果用户更改日期时间格式,则插入时会出现问题.

我的想法是SELECT GETDATE()在应用程序启动时使用,然后使用VB.Net识别其日期时间格式.每当我尝试插入日期时间值时,我会将其转换为应用程序启动时标识的日期时间格式.

是否有更好的方法在应用程序和SQL Server之间使用一致的日期时间格式以避免冲突.例如:将一天与一个月混合.

mar*_*c_s 9

SQL Server不DateTime以任何字符串格式存储 - 它存储为8字节数值.

各种设置(语言,日期格式)仅影响DateTime在SQL Server Management Studio中向您显示的方式 - 或者在您尝试将字符串转换为a时如何解析它DateTime.

SQL Server支持许多格式 - 请参阅CDN和CONVERT上MSDN联机丛书.大多数这些格式取决于您拥有的设置 - 因此,这些设置可能会有效 - 有时不会.

所以,如果可能的话,不要DateTime所有时间之间转换日期和字符串!将其保留为DateTime.NET,使用DATEDATETIME2(n)在SQL Server中,并使日期采用其本机格式.使用支持本机数据类型的参数化查询,DateTime这样您就不需要将日期转换为字符串并返回!

如果由于某种原因必须使用字符串来表示日期,唯一可靠的解决方法是使用SQL Server支持的(略微调整的)ISO-8601日期格式 - 这种格式始终有效 - 无论您的SQL Server语言如何和dateformat设置.

ISO-8601格式由SQL Server支持有两种形式:

  • YYYYMMDD只为日期(没有时间部分); 请注意:没有破折号!,这非常重要!YYYY-MM-DD不是独立于你的SQL Server的日期格式设置,将适用于所有情况!

要么:

  • YYYY-MM-DDTHH:MM:SS对于日期和时间 - 请注意:此格式破折号(但可以省略),并且T在您的日期和时间部分之间固定为分隔符DATETIME.

这适用于SQL Server 2000及更高版本.

如果您使用SQL Server 2008或更新版本以及DATE数据类型(仅限DATE- DATETIME!),那么您确实也可以使用该YYYY-MM-DD格式,并且该格式也适用于SQL Server中的任何设置.

不要问我为什么整个主题如此棘手而且有些混乱 - 这就是它的方式.但是使用这种YYYYMMDD格式,您可以适用于任何版本的SQL Server以及SQL Server中的任何语言和日期格式设置.

DATE如果您只需要日期部分,并且DATETIME2(n)需要日期和时间,则建议使用SQL Server 2008及更高版本.您应尽可能尝试开始逐步淘汰DATETIME数据类型

  • 使用参数化查询可以解决问题,现在无论我传入哪种格式,数据库都会自动处理它,谢谢。 (2认同)