我目前面临的挑战是在NVarChar字段中存储DateTime值,以使其独立于文化。
我已经读过你可以使用CONVERT(int, GETDATE(), 112)
将值转换为int,这应该使它与文化无关,但前一个语句不会存储时间。
将DateTime存储为独立于文化的行业标准是什么?
请注意,我无法在我的场景中使用DateTime。它必须是NVarChar。
好的,找到了我自己问题的答案。
将DateTime转换为二进制(8)原始格式: convert(binary(8),GETDATE())
然后我将值存储在VARCHAR字段中,如下所示: CONVERT(VARCHAR(MAX),转换(二进制(8),GETDATE()),2)
要从varchar字段中检索它并将其转换为DateTime: CONVERT(DateTime,CONVERT(binary(8),[TextField],2))
就像我所关注的那样,这会将DateTime存储为独立于文化。
似乎用户Kaf拥有最佳解决方案。我宁愿使用格式126将其转换为文本,然后从文本返回DateTime。
谢谢大家,对此感到抱歉。
答案 0 :(得分:3)
如果您CANNOT
将日期存储为日期时间,则可以使用 style 126
,这会提供ISO8601 format
(yyyy-mm-ddThh:mi:ss.mmm (no spaces)
)。我认为它与文化无关。
<强> Fiddle demo 强>
select convert(nvarchar(50),getdate(),126)
最好的办法是将日期存储为日期时间/日期类型。
答案 1 :(得分:2)
您应该使用DATETIME
或DATETIME2
数据类型来存储日期和时间值。它们以二进制格式存储在数据库中,并且与文化无关。
您可以在此处阅读有关MSDN的更多信息:http://msdn.microsoft.com/en-us/library/ms187819(v=sql.100).aspx
有关SQL Server如何存储日期时间值的更多信息:“它使用8个字节来存储日期时间值 - 前4个用于日期,第2个用于存储日期时间值。” (来自:http://sqlmag.com/sql-server/solving-datetime-mystery)
答案 2 :(得分:0)
我不明白这个想法是在varchar字段中存储日期,以便它是'文化独立'。 dateTime数据类型是独立于文化的。文化依赖的是日期值的显示方式:
MM/dd/YYYY
dd/MM/YYYY
YYYY-MM-DD
etc
但是,如果显示更改,基础值本身仍然相同......这就是为什么您可以轻松地将日期从一种格式转换为另一种格式....
因此,为了简单起见,我强烈建议您切换到与文化无关的日期时间字段。否则,任何进一步使用此字段的内容(计算,显示,打印输出等)将是真正的PITA ......