0

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

让我给你我的问题的例子:

时,我有日期10/02/2012,我将其插入到SQL Server中我看到这样的数据:

2012-10-02 

,但我想有这样的:2012-02-10

当我有日期29/02/2012,我将它插入到SQL Server中我看到的数据格式正确:2012-02-29

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

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

任何想法如何解决呢?

+0

代码看起来像做什么插入?此外 - 要检查它是否是显示格式问题,您可以执行一些DATEPART调用来查看日/月以查看它是否正确存储。 – RQDQ 2012-02-10 19:49:42

+0

我通常只使用VBScript'FormateDateTime()',但它不会出来你想要它,只是一个想法。 – 2012-02-11 05:47:20

回答

1

有几种可能性,但它们都与您的字符串所经过的系统组件(即,ASP运行时和SQL Server)的日期格式设置有关。

有分析过程中的SQL Server中的日期格式设置http://msdn.microsoft.com/en-us/library/ms189491.aspx

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

+0

所以你认为我必须解决服务器中的iis问题? – perastikos1 2012-02-10 20:07:39

+0

@ perastikos1您需要首先了解您的日期是字符串以及它们在何处转换为日期时间。当表单提交日期时间时,它通常在文本中,然后根据区域设置由VBScript进行分析,如果您将其放入变量中。如果您的SQL是从VBScript生成的,那么VBScript中的日期时间变量将转换为字符串(再次使用会话区域设置),然后由SQL解析器根据SQL Server设置解释THEN。最后一部分不适用于ADO中的参数化查询或存储过程。 – 2012-02-10 20:13:54

+0

@ perastikos1有些日期不明确:10/02/2012可能是2012年2月10日或2012年10月2日。 2012年2月29日和29/02/2012不是不明确的,但不幸的是,它们总是会在一些试图有帮助的解析器中正确转换。 – 2012-02-10 20:18:53

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业务栏来管理它。

未来,我可以请求您提问时,您提供了更具体的例子,即您的表名,列名,所以我不必一直发明这些。

+0

谢谢回答,帮助我的东西,我设法插入varchar字段与我想要的格式,例如01/03/2012是今天,现在我想查找日期之间的行,例如我想查找20/02年之间的行/ 2012至01/03/2012但问题是我无法比较varchar字段,我如何管理?如果我尝试使用此命令将varchar转换为datetime:convert(Datetime,'01/03/2012',103)我拿这个结果03/01/2012,我不想那 – perastikos1 2012-03-01 18:02:56

+0

嗨@ perastikos1我回答了你的问题。我将不胜感激。从技术上说,你的最新问题是一个新问题。今后,请提供更具体的例子来消除歧义和误解,即您的表格和列的名称,所以我不必发明它们。 – 2012-03-01 22:06:33