日期时间列SQL Server中的类型错误

时间:2012-02-10 19:44:08

标签: sql sql-server asp-classic internationalization date-formatting

我在asp中有一个应用程序。我将数据插入到SQL Server中的datetime类型列。

让我举一个例子来说明我的问题:

当我有日期10/02/2012并将其插入SQL Server时,我会看到如下数据:

 2012-10-02

但我希望这样:2012-02-10

当我有日期29/02/2012并将其插入SQL Server时,我会以正确的格式查看数据:2012-02-29

如何管理我想要的正确类型?

数据库和表的排序规则是Greek_CI_AS,用我的语言

任何想法如何解决?

2 个答案:

答案 0 :(得分:1)

有一些可能性,但它们都与字符串传递的系统组件的日期格式设置有关(即ASP运行时和SQL Server)。

SQL Server http://msdn.microsoft.com/en-us/library/ms189491.aspx

中有一个日期格式设置

在ASP中,VBScript中字符串的解析取决于解析期间有效的设置 - 基本上是http://support.microsoft.com/kb/306044

答案 1 :(得分:1)

您可以使用CONVERT()来控制日期格式,您可以指定一个较小的目标字符串来裁剪结果:

SELECT CONVERT(NVARCHAR(10), GETDATE(), 21) -- YYYY-MM-DD
SELECT CONVERT(NVARCHAR(10), GETDATE(), 102) -- YYYY.MM.DD
SELECT CONVERT(NVARCHAR(10), GETDATE(), 105) -- DD-MM-YYYY
SELECT CONVERT(NVARCHAR(10), GETDATE(), 110) -- MM-DD-YYYY
SELECT CONVERT(NVARCHAR(5), GETDATE(), 105) -- DD-MM
SELECT CONVERT(NVARCHAR(5), GETDATE(), 110) -- MM-DD
SELECT CONVERT(NVARCHAR(4), GETDATE(), 102) -- YYYY

 -- To get YYYY-DD-MM, put two of the above together:
SELECT CONVERT(NVARCHAR(4), GETDATE(), 102)
       + '-' + CONVERT(NVARCHAR(5), GETDATE(), 105)

要强制插入日期格式,您可以执行类似的操作:

-- Insert in Italian dd-mm-yy (e.g. 10th February 2012)
INSERT INTO user_table VALUES (CONVERT(DATETIME, '10-02-12', 5));
-- Insert in USA mm-dd-yy (2nd October 2012)
INSERT INTO user_table VALUES (CONVERT(DATETIME, '10-02-12', 10));

请参阅Microsoft MSDN参考CAST and CONVERT (Transact-SQL)

----回答其他问题----

我发现你的最新评论有点含糊不清。如果您正在询问如何在字符串格式的两个日期之间搜索datetime字段,请尝试以下操作:

SELECT *
FROM   user_table
WHERE  mydate BETWEEN convert(Datetime,'20/02/2012',103)
              AND     convert(Datetime,'01/03/2012')

然而,如果您尝试使用字符串格式搜索两个日期的nvarchar字段,那么请尝试以下操作:

SELECT *
FROM   user_table
WHERE  convert(Datetime, mynvarchar, 103)
       BETWEEN convert(Datetime,'20/02/2012',103)
       AND     convert(Datetime,'01/03/2012')

然而,这非常低效。如果您要进行大量日期搜索,我强烈建议您将日期字段存储为日期时间格式。如果您有业务需求来存储nvarchar版本,那没关系,但您可以使用动态列,例如:

CREATE TABLE user_table
(
     mynvarchar   NVARCHAR(10),      -- Date as a String in DD/MM/YYYY format
     mydatetime   AS CONVERT(DATETIME, mynvarchar, 103) PERSISTED
);

这样做的好处是mydatetime字段会自动更新,如果您愿意,可以在索引和约束中使用,但是,您可以通过操作mynvarchar业务列来管理它。 / p>

将来,当您提出问题时,我可以请求您提供更具体的示例,即您的表名,列的名称,因此我不必继续发明这些。