我想在今天的日期检查表中是否已存在任何记录,而sql-server
位于美国。
我尝试了下一个查询,但我获得了0条记录,尽管今天的日期表中有23条记录。
插入代码
public void InsertSmsDetails()
{
DateTime today = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("India Standard Time"));
string usecase = "manhole_Chennai";
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["constr"].ConnectionString);
con.Open();
SqlCommand cmd = new SqlCommand("insert into sms (updtd_date,usecase,sms) values ('" + today + "','" + usecase + "','"+TempData["SMSBody"].ToString()+"')", con);
try
{
cmd.ExecuteNonQuery();
}
}
查询获取数据
SELECT *
FROM SMS
where updtd_date > CONVERT(date,GETDATE())
and usecase = 'manhole_Chennai'
请注意,updtd_date
列的类型为datetime
示例数据:
2018-03-05 12:35:15.000 manhole_Chennai 11383 Alert : Manhole is filled 6.41666666666667 at time02/05/2018 16:11:09 NULL NULL
2018-03-05 12:34:40.000 manhole_Chennai 11382 Alert : Manhole is filled 6.41666666666667 at time02/05/2018 16:11:09 NULL NULL
2018-03-05 12:34:07.000 manhole_Chennai 11381 Alert : Manhole is filled 6.41666666666667 at time02/05/2018 16:11:09 NULL NULL
2018-03-05 12:33:33.000 manhole_Chennai 11380 Alert : Manhole is filled 6.41666666666667 at time02/05/2018 16:11:09 NULL NULL
2018-03-05 12:32:58.000 manhole_Chennai 11379 Alert : Manhole is filled 6.41666666666667 at time02/05/2018 16:11:09 NULL NULL
2018-03-05 12:32:21.000 manhole_Chennai 11378 Alert : Manhole is filled 6.41666666666667 at time02/05/2018 16:11:09 NULL NULL
答案 0 :(得分:2)
您的问题是使用InsertSmsDetails()
方法将数据插入数据库的方式,而不是您查询数据的方式。
您的代码可能会生成此gem:
insert into sms (updtd_date, usecase, sms)
values ('03/05/2018','manhole_Chennai 11383','Alert : Manhole is filled 6.41666666666667 at time02/05/2018 16:11:09');
由于美国的语言环境,您的日期'03/05/2018'
会被插入字符串并被误解为3月5日。
因此,解决此问题的正确方法是改变您保存数据的方式,还可以更改存储时间戳的方式。有几种选择:
datetimeoffset
数据类型,其中包含时区信息。答案 1 :(得分:1)
您请求的记录大于今天的日期
如果你想要今天的记录:
SELECT *
FROM SMS
where CAST(updtd_date) = CAST(getdate())
and usecase ='manhole_Chennai'
今天和未来的记录:
SELECT * FROM SMS where updtd_date >= CONVERT(date,GETDATE()) and usecase ='manhole_Chennai'
答案 2 :(得分:0)
您当前的查询应返回updtd_date
今天或更晚的所有记录。
为了防止获得将来的记录,您需要添加另一个条件。
首先,创建并填充样本表(请在将来的问题中保存此步骤):
DECLARE @T AS TABLE
(
id int identity(1,1),
updtd_date datetime
)
INSERT INTO @T (updtd_date) VALUES
(DATEADD(DAY, -2, GETDATE())),
(DATEADD(DAY, -1, GETDATE())),
(DATEADD(HOUR, -2, GETDATE())),
(DATEADD(HOUR, -1, GETDATE())),
(GETDATE()),
(DATEADD(HOUR, 1, GETDATE())),
(DATEADD(HOUR, 2, GETDATE())),
(DATEADD(DAY, 1, GETDATE())),
(DATEADD(DAY, 2, GETDATE()))
查询:
SELECT Id,
updtd_date
FROM @T
WHERE updtd_date > CAST(GETDATE() AS DATE)
AND updtd_date < DATEADD(DAY, 1, CAST(GETDATE() AS DATE))
ORDER BY id
结果:
Id updtd_date
3 03.05.2018 07:15:13
4 03.05.2018 08:15:13
5 03.05.2018 09:15:13
6 03.05.2018 10:15:13
7 03.05.2018 11:15:13
答案 3 :(得分:0)
对于迟到的回复感到抱歉。问题很简单:当我看到你的InsertSmsDetails()代码时,你的代码适用于印度时区(硬编码)。
然后,您的服务器在美国。这里有巨大的时区差异。它的原因,为什么你没有看到记录。
要解决您的问题,您不能使用GETDATE(),因为它返回USA datetime。您的表数据在保存时考虑到了印度日期时间偏移量。在这种情况下,您需要将两个日期时间概括为可比较的。
假设您的已编码印度标准时间日期时间偏差为UTC +5:30(或分钟+330)。然后你可以用它来解决你的问题:
select
*
from
[sms]
where
[updtd_date] > convert(date, switchoffset(sysdatetimeoffset(), 330))
and [usecase] = 'manhole_Chennai';
请记住,夏季/冬季时间切换会有潜在问题。因此,尝试修改代码以使用偏移值保存所有日期(即使用datetimeoffset数据类型而不是datetime)