2014-09-03 98 views
-1

我正在使用C#,MVC 4,SQL Azure。SQL Azure:在两个日期之间获取数据,日期为字符串

背景:我正在用DB编写一个网站,用户在网站上的每个动作都将作为用户活动保存在我的数据库中。

每一行,因为这些列:

  • ID
  • 日期
  • 用户名
  • 说明

现在到了我的问题,在我的国家,我们这样写日期: DD/MM/YYYY

示例:29/11/2014

奇怪我知道,但我需要这种格式。

我尝试了一千种方法将INSERT日期值转换成我的数据库(SQL Azure),它们的格式不同,而且没有任何东西可以工作,而且微软在那里得到了3种类型的Date,它非常非常混乱,所以我也只是设置日期字段作为一个字符串,我组装这样的日期:

string date = DateTime.Now.Day.ToString() + "/" 
+ DateTime.Now.Month.ToString() + "/" 
+ DateTime.Now.Year.ToString() + " " 
+ DateTime.Now.Hour.ToString() + ":" 
+ DateTime.Now.Minute.ToString(); 

现在我想与查询使用两个日期“之间”这样的数据:

SELECT [ID] 
    ,[Date] 
    ,[User] 
    ,[Description] 
FROM [dbo].[ActivityLog] 
WHERE [Date] BETWEEN 03/09/2014 AND 04/09/2014; 

我得到这个错误:

将nvarchar值'3/9/2014 21:3'转换为数据类型int时转换失败。

我的日期看起来像这样的DB:

3/9/2014 21:3 

如果有人能指导我这个槽......谢谢

这是我的代码:

public static void UpdateLog(string userName, string description) 
    { 
     try 
     { 
      string guid = Guid.NewGuid().ToString(); 
      string date = DateTime.Now.Day.ToString() + "/" + DateTime.Now.Month.ToString() + "/" + DateTime.Now.Year.ToString() + " " + DateTime.Now.Hour.ToString() + ":" + DateTime.Now.Minute.ToString(); 

      string query = "INSERT INTO ActivityLog VALUES('" + guid + "' , '" + date + "' , '" + userName + "' , '" + description + "')"; 
      AdoHelper.ExecuteNonQuery(query); 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

更新:

我改变了我的代码如下:

string query = "INSERT INTO ActivityLog VALUES('" + guid + "' , '" + DateTime.Now + "' , '" + userName + "' , '" + description + "')"; 

现在,当我看着我的数据库我看到这一点:

03-Sep-14 

酷似我的电脑是在右下角写(托盘图标那里)。

但是,这是一个问题,因为其他人进入网站,并在他的计算机上他写的日期不同,所以他会插入数据库不同的格式,我能做些什么来解决这个问题?世界标准时间 ?

+1

我会建议做一些文化和字符串格式的研究:http://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx和http:// msdn .microsoft.com/en-us/library/vstudio/bz9tc508(v = vs.100).aspx – 2014-09-03 18:50:24

+1

不要将日期转换为字符串。而是将日期作为参数传递给查询。显示你的代码,我可以告诉你如何去做。 – 2014-09-03 18:54:18

+0

'将nvarchar值'3/9/2014 21:3'转换为数据类型int.'时转换失败。日期字段的数据类型是什么。错误消息告诉你它期望一个int,因为日期是在数据库中定义为'TimeStamp'的日期。 – MethodMan 2014-09-03 18:54:44

回答

2

您不应该将日期转换为字符串。相反,您应该将日期作为参数传递给查询。

如果你真的想串,使用MS SQL Server的标准:YYYY-MM-dd hh:mm:ss(你在查询结果看到的格式并不一定是服务器接受的格式

您也将有单间通报引用,这样的:

SELECT [ID] 
    ,[Date] 
    ,[User] 
    ,[Description] 
    FROM [dbo].[ActivityLog] 
    WHERE [Date] BETWEEN '2014-09-03' AND '2014-09-04'; 
+0

Caffe删除答案,以便其他人不给你' - 负面标记' – MethodMan 2014-09-03 18:55:40

+0

@GordonLinoff谢谢,伙计们。我编辑它是一个答案。 – 2014-09-03 18:58:56

1

这是where条款:

WHERE [Date] BETWEEN 03/09/2014 AND 04/09/2014 

这是失败,因为/是一个叫师算术运算符,所以我认为这正在变成:

WHERE [Date] BETWEEN 0 and 0 

这些都是整数,SQL Server试图[Date]转换为比较整数 - 因此错误。不幸的是(这不是那么不幸),简单的修复:

WHERE [Date] BETWEEN '03/09/2014' AND '04/09/2014' 

只提供了一点点的解脱。它确实发生在这种情况下,因为日期是在同一个月。但它不会在一般情况下工作,因为这些都为字符串相比:

WHERE [Date] BETWEEN '03/09/2014' and '01/10/2014' 

大概是不会做你期望的。

通过在数据库中存储日期作为字符串,你犯了一个基本错误。使用正确的类型(在这种情况下,datedatetime应该没问题)。然后你的比较将起作用。将常量放入SQL Server时,将它们转换为YYYY-MM-DD形式的字符串,因为SQL Server以这种格式理解字符串。所以,您的查询看起来是这样的:

WHERE [Date] BETWEEN '2014-09-03' and '2014-09-04' 

(或者你可以使用显式转换,这在我看来只是使查询更难读。)

你的同胞国家的人如何选择看日期是无关紧要的。输出日期时,请使用convert()将其转换为首选格式。当您将日期作为字符串输入时,请使用convert()从首选格式转换 - 或者让他们从日历工具中选择日期。在数据库内部,使用数据库最熟悉的格式 - 内置的日期和时间类型。

+0

Gordon所以你的底线是: 我需要发送一个DateTime(类型)到SQL服务器并将它存储在Azure中的日期时间字段中,并像美国人一样使用日期工作? – Ron 2014-09-03 19:19:30

+0

我试图从一种格式转换为另一种格式的DateTime,它从来没有工作过......你之前使用过convert吗? – Ron 2014-09-03 19:20:34

+0

@Ron ...是的,经常。 – 2014-09-03 19:44:34

1

如果您试图在SQL中完成此操作而不是您的代码,并且您的日期值保证以上述示例的方式一致地格式化,则可以使用下面的CONVERT/CAST方法获取格式你需要。

SELECT CONVERT(varchar(50),CAST('3/9/2014 21:3' as smalldatetime),103) [DD/MM/YYYY Format] 

本文就CAST和CONVERT也可能对你有用。 http://msdn.microsoft.com/en-us/library/ms187928.aspx

相关问题