【问题标题】:Best approach to having consistent datetime formats between SQL Server & VB.Net在 SQL Server 和 VB.Net 之间保持一致的日期时间格式的最佳方法
【发布时间】:2014-06-09 07:42:06
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql-server vb.net datetime datetime-format


    【解决方案1】:

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

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

    SQL Server 支持多种格式 - 请参阅MSDN Books Online on CAST and CONVERT。这些格式中的大多数取决于您拥有的设置 - 因此,这些设置有时可能有效 - 有时无效。

    因此,如果可能的话,不要一直转换DateTime 和字符串之间的日期!在 .NET 中将其保留为 DateTime,在 SQL Server 中使用 DATEDATETIME2(n),并让日期为其原生格式。使用支持原生 DateTime 数据类型的参数化查询,因此您不需要将日期转换为字符串并返回!

    如果出于某种原因必须使用字符串来表示日期,解决此问题的唯一可靠方法是使用 SQL Server 支持的(稍作修改)ISO-8601 日期格式 - 这个格式始终有效 - 无论您的 SQL Server 语言和日期格式设置如何。

    SQL Server 支持的ISO-8601 format 有两种形式:

    • 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 中的任何语言和日期格式设置。

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

    【讨论】:

    • 使用参数化查询成功了,现在无论我传入哪种格式,数据库都会自动处理它,谢谢。
    • 非常好的和完整的答案+1
    猜你喜欢
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 2020-09-23
    相关资源
    最近更新 更多