SQL Azure:获取2个日期之间的数据,日期为字符串

时间:2014-09-03 18:48:36

标签: c# sql date datetime azure

我正在使用C#,MVC 4,SQL Azure。

背景:我正在使用DB对网站进行编程,网站上用户的每个操作都将作为用户活动保存在我的数据库中。

每行作为这些列:

  • ID
  • 日期
  • 用户ID
  • 描述

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

示例:29/11/2014

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

我尝试了一千种方法将INSERT日期值添加到我的数据库(SQL Azure)中,使用不同的格式,似乎没有任何工作,最重要的是微软得到了3种类型的日期,非常令人困惑,所以我所做的只是将日期字段设置为字符串,我将这样的日期组合起来:

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。

我的日期在数据库中显示如下:

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

就像我的电脑正好在右下角(托盘图标所在位置)写作。

但这是一个问题,因为其他人进入网站并在他的计算机上以不同的方式编写日期,因此他会插入不同格式的数据库,我该怎么做才能解决这个问题? UTC?

3 个答案:

答案 0 :(得分: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'; 

答案 1 :(得分: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()从首选格式转换 - 或者让他们从日历工具中选择日期。在数据库内部,使用数据库最熟悉的格式 - 内置日期和时间类型。

答案 2 :(得分: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