我有一个遗留应用程序,其输入是日期字符串,即:
2009年6月12日
输入的格式总是一个字符串,并且是一致的,它始终是dd / mm / yyyy
目前,旧应用程序只是在DateTime字段中插入它。显然,如果服务器的本地化文化设置发生变化,我们就会出现错误。
两个问题:
一:
在这种情况下,最安全的方法是在SQLServer中存储日期吗?
是否有一种格式无论日期和月份的顺序如何都会被正确解释?
两个的
哪些设置确切地决定了SQLServer DB的文化,是OS设置,还是该DB的设置,或者是什么?
欢呼声
答案 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。
的正确格式插入