在SQLServer中保存日期

时间:2009-06-03 22:59:38

标签: sql-server datetime

我有一个遗留应用程序,其输入是日期字符串,即:

  

2009年6月12日

输入的格式总是一个字符串,并且是一致的,它始终是dd / mm / yyyy

目前,旧应用程序只是在DateTime字段中插入它。显然,如果服务器的本地化文化设置发生变化,我们就会出现错误

两个问题:

在这种情况下,最安全的方法是在SQLServer中存储日期吗?

是否有一种格式无论日期和月份的顺序如何都会被正确解释?

两个

哪些设置确切地决定了SQLServer DB的文化,是OS设置,还是该DB的设置,或者是什么?

欢呼声

7 个答案:

答案 0 :(得分:9)

格式YYYY-MM-DD是明确的,这意味着SQL Server不会混淆月份 以及将字符串值转换为DATETIME的日期。 (我从未遇到使用四位数年份使用该格式进行隐式转换的问题。)

在SQL Server中存储日期值的“最安全”(也是最方便)的方法是使用DATETIME数据类型。

CONVERT和字符串之间进行转换时,使用DATETIME函数明确指定输入和输出格式。

有关CONVERT 样式 参数值的SQL Server 2005文档:

http://msdn.microsoft.com/en-us/library/ms187928(SQL.90).aspx

将字符串表示形式转换为DATETIME数据类型:

select CONVERT(datetime, '2009-06-03', 20)

第一个参数是要转换的数据类型,第二个参数是要转换的表达式,第三个参数是样式

style 20是ODBC Canonical format = 'YYYY-MM-DD HH:MI:SS'(24小时制)


[随访]

将DATETIME表达式(例如getdate()转换为'YYYY-MM-DD'格式的VARCHAR:

select CONVERT(varchar(10), getdate(), 20)

请注意,指定varchar(10)只能获得etnire 'YYYY-MM-DD HH:MM:SS'格式的前10个字符。

[/随访]


至于什么决定了默认格式,那将是研究。我们通过指定格式来避免默认格式引起的问题。

答案 1 :(得分:4)

SET DATEFORMAT。 SQL“文化”由SET LANGUAGE在会话级别设置。 SQL Server有自己的日期格式设置,独立于托管操作系统。这有几个原因:ANSI合规性,以防止操作系统更改使用托管在该主机上的数据库影响应用程序,而不仅仅是兼容性,SQL早于操作系统当前正在运行。

答案 2 :(得分:3)

我建议将所有日期存储在数据库中的UTC时间内。这样一致。

这样存储日期似乎运作良好......

YYYY-MM-DD

答案 3 :(得分:2)

请记住,DATA不是它的演示文稿。在这种情况下,DATA是DATE或DATETIME,无论您如何显示它们 至于插入/更新/比较日期时间值,我引用BOL:

  

在比较中指定日期时   或输入INSERT或UPDATE   语句,使用常量   对所有语言都解释相同   设置:ADO,OLE DB和ODBC   应用程序应该使用ODBC   时间戳,日期和时间转义   条款:
  {ts'yyyy-mm-dd   hh:mm:ss [.fff]'}如:{ts   '1998-09-24 10:02:20'}
  {d'yyyy-mm-dd'}如:{d'1998-09-24'}
  {t'hh:mm:ss'}如:{t '10:02:20'}

我可以向您保证,如果您使用这种格式,它们将始终有效,无论您的服务器的区域设置如何

答案 4 :(得分:0)

我在这些方面有点保守,但我更喜欢在表中使用单独的Year / Month / Day字段,而不是使用DBMS特定数据类型的Date字段。它肯定需要更多空间,但缺乏模糊性和增加便携性对我来说是值得的。

您支付的价格是您没有获得免费的日期/时间算术和排序,但是您可以轻松地完成自己或稍微复杂的“ORDER BY”条款。

答案 5 :(得分:0)

我同意spencer7593的建议,但请注意,使用没有格式的强制转换或转换可能会产生意外结果。此T-SQL查询返回12而不是1。

set language British
select month(CAST('2016-01-12' AS datetime))

答案 6 :(得分:0)

通常我更喜欢插入

insert into tbl values('yyyyMMdd')

然后,它将以基于db。

的正确格式插入