C# 在日期之间获取数据
所以,我想在mssql中检索两个日期之间的数据。我有一个表,名字是FILES。我有两列,名字是NAME,RECORDDATE(nvarchar)。当我保存数据时,我从raddatetimepicker.text获取数据,因此我的值为“2015年12月22日星期二” 我的问题是C# 在日期之间获取数据,c#,sql-server,C#,Sql Server,所以,我想在mssql中检索两个日期之间的数据。我有一个表,名字是FILES。我有两列,名字是NAME,RECORDDATE(nvarchar)。当我保存数据时,我从raddatetimepicker.text获取数据,因此我的值为“2015年12月22日星期二” 我的问题是 select * from FILES where RECORDDATE>= '11 January 2015 Saturday' and RECORDDATE<= '24 October 2015 Monda
select * from FILES where RECORDDATE>= '11 January 2015 Saturday' and RECORDDATE<= '24 October 2015 Monday'
从RECORDDATE>='2015年1月11日星期六'和RECORDDATE的文件中选择*如果您的RECORDDATE
实际上是数据库中的DATETIME
字段,则以下为真。您当前将应该是DATETIME
的内容存储为NVARCHAR
立即停止此操作,并使用正确的类型强>
任何DateTimePicker
都应该具有返回DateTime
的属性。如果没有:将其转储并使用合适的。也就是说,您可以使用参数化查询正确地存储和查找记录
插入将如下所示:
DateTime recordDate = dtpDate.Value;
using (SqlCommand cmd = new SqlCommand("insert into FILES (NAME, RECORDDATE) VALUES (@name, @recorddate)", conn))
{
cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = someName;
cmd.Parameters.ADd("@recorddate", SqlDbType.DateTime).Value = recordDate;
cmd.ExecuteNonQuery();
}
然后,查找查询归结为:
DateTime start = dtpStart.Value;
DateTime end = dtpEnd.Value;
using (SqlCommand cmd = new SqlCommand("select * from FILES where RECORDDATE BETWEEN @start and @end", conn))
{
cmd.Parameters.Add("@start", SqlDbType.DateTime).Value = start;
cmd.Parameters.Add("@end", SqlDbType.DateTime).Value = end;
using (SqlDataReader reader = cmd.ExecuteReader())
...
}
这样做可以解决以下问题:
如果使用String.Format
或类似方法插入参数,则可以进行SQL注入
不同的日期格式并不重要,因为.NET会将日期正确地转换为SQL server能够理解的格式
实际上是字符串比较,而不是日期比较,因为RECORDDATE是NVARCHAR(unicode字符串)
第一个字符串以“28..”开头,所以它比以“24”开头的字符串大,所以始终为false,因此为0行
看看这个答案:因为将日期存储为字符串,所以您执行的是字符串比较,而不是日期比较。更新值后,您将在2015年1月28日星期二到2015年10月24日星期一之间检查字符串。如果值越小,则永远不会返回任何行
如果要查找两个日期之间的值,最好将数据类型更改为DateTime
如果不可能,则可以将列强制转换为DateTime
,例如
SELECT * FROM FILES
WHERE RECORDDATE >= CAST('11 January 2015 Saturday' AS DATETIME)
AND RECORDDATE <= CAST('24 October 2015 Monday' AS DATETIME)
从文件中选择*
其中RECORDDATE>=CAST(日期时间为2015年1月11日星期六)
和RECORDDATE在比较中,您是在比较字符串,而不是日期。在里面在您的示例中,这意味着'28…'>'24…'
你也应该
- 更改数据库设计以将日期存储为
DATETIME
值,或
顺便说一下,包括工作日在内,不需要检查日期范围,因此我建议删除它以避免错误。事实上,您的示例中似乎有一个错误:在您的问题中,星期二应该是星期三。试试这个
select * from FILES where RECORDDATE between STR_TO_DATE('11 January 2015 Saturday',"%d %M %Y %W") and STR_TO_DATE('24 October 2015 Monday',"%d %M %Y %W")
希望你能修复你的数据。。。但根据您的示例日期,这里有一个CTE,它将修复您的日期并格式化您的数据,以便对其进行过滤
WITH [SubDates] AS (
SELECT
[FILES].*
,SUBSTRING([FILES].[RECORDDATE], 0, PATINDEX('%20[0-9][0-9] %', [FILES].[RECORDDATE]) + 4) AS [RECORDDATE_Sub]
FROM [FILES]
), [AsDates] AS (
SELECT
[SubDates].*
,CASE ISDATE([SubDates].[RECORDDATE_Sub])
WHEN 1 THEN CONVERT(DATE, [SubDates].[RECORDDATE_Sub])
END AS [RECORDDATE_Fixed]
FROM [SubDates]
)
SELECT *
FROM [AsDates]
WHERE
[AsDates].[RECORDDATE_Fixed] BETWEEN '11 January 2015' AND '24 October 2015'
决不能将DateTime
值存储为字符。你有。1月28日之后可能没有数据@seoduYeah。。这会很有趣的。但这是可能的。对不起,如果你甚至没有想法,那么事情看起来就不好了:(@Seodu我真的很想看到你的应用程序在我的德国Windows上运行…:-DYou可以用持久化的计算列修复数据,但我觉得日期的格式像他自己的一样,有很多SELECT*
查询需要处理。当然,我总是假设日期/时间是使用适当的类型存储在数据库中的.如果不是这样的话…好吧…这就是你得到的。我的天啊…我刚刚看到他实际上将日期存储为nvarchar
。似乎我以前没有正确阅读这个问题。哦,好吧…是的…我想这会很容易,不是吗:)我觉得有点惭愧,我读到这个问题,好像他在数据库里有正确的数据,然后想和这个日期字符串作比较。我一直想知道人们是怎么考虑这样一个精心设计的(甚至有用的)。数据模型…他说sql server在MSSQL中不是MySQL。那么你应该在MS-sql中搜索日期格式转换。你来这里是为了回答这个问题,而不是告诉他搜索。为不同的DBMS提供解决方案会让OP更加困惑。如果这么简单(只需一个谷歌),是什么阻止你在这里提供答案,而不是写一些误导性的东西,然后告诉他自己用谷歌搜索正确的解决方案?哈哈……我们不是想挑起争端,只是要指出,建议某人使用他们平台上不存在的功能无助于消除他们的困惑。你的答案是正确的但也有其他答案是正确的,所以我不知道如何将所有答案标记为答案:)谢谢。你的答案是正确的,但其他答案也是正确的,所以我不知道如何将所有答案标记为答案:)谢谢。@Seodu很遗憾你不能这样做,但你可以投票给他们:-)请,为了你自己的理智,更改你的数据模型。我现在正在更改@ThorstenDittmar:)你的答案是正确的,但其他答案也是正确的,所以我不知道如何将所有答案标记为答案:)谢谢。@Seodu,通常如果答案同样有用,那么选择最老的答案。如果某个特定的答案更有用,那么选择该答案。