无法获得今天的记录

时间:2018-05-03 06:57:05

标签: sql sql-server

我想在今天的日期检查表中是否已存在任何记录,而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

table

4 个答案:

答案 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日。

因此,解决此问题的正确方法是改变您保存数据的方式,还可以更改存储时间戳的方式。有几种选择:

  1. 以UTC格式存储时间戳
  2. 使用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

See a live demo on rextester.

答案 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)