我正在使用C#,MVC 4,SQL Azure。
背景:我正在使用DB对网站进行编程,网站上用户的每个操作都将作为用户活动保存在我的数据库中。
每行作为这些列:
现在问题来了,在我的国家,我们写下这样的日期: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?
答案 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'
可能不会做你期望的事。
通过在数据库中将日期存储为字符串,您已经犯了一个根本性的错误。使用正确的类型(在这种情况下,date
或datetime
应该没问题)。然后你的比较将起作用。将常量放入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