获取今天创建的所有行

iCu*_*ous 10 sql-server

我无法获得今天创建的所有行.我已经使用了多种功能,如getdate(),Cast,Convert白白等,但所有.

这是我的基本查询:

SELECT timeId
FROM table_roaster_time_table
WHERE (user_id = @user_id) AND (DATEDIFF(d, date, GETDATE()) = 0)
Run Code Online (Sandbox Code Playgroud)

我想timeId从将要提供的表table_roaster_time_table中获取userid,日期是今天.

我该怎么做呢?

Aar*_*and 26

为了保留在[date]列上使用索引的任何机会(即使今天不存在,也可能在将来),请尝试:

AND [date] >= DATEADD(DAY, 0, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP))
AND [date] <  DATEADD(DAY, 1, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP));
Run Code Online (Sandbox Code Playgroud)

如果您正在使用SQL Server 2008或更高版本,您可以执行类似这样的操作来缩短代码,但仍然可以使用索引([date]如果存在):

AND CONVERT(DATE, [date]) = CONVERT(DATE, CURRENT_TIMESTAMP);
Run Code Online (Sandbox Code Playgroud)

编辑

由于您似乎很困惑,为什么3/6/2012是3月6日而不是6月3日,我可能还建议您不要手动将不明确的日期文字插入'3/6/2012'到数据库中,而是将列设置为默认值,例如:

ALTER TABLE dbo.table_roaster_time_table
  ALTER COLUMN [date] DATETIME NOT NULL;

ALTER TABLE dbo.table_roaster_time_table
  ADD CONSTRAINT df_date DEFAULT (CURRENT_TIMESTAMP)
  FOR [date];
Run Code Online (Sandbox Code Playgroud)

如果您要插入日期文字,那么至少要使用安全且明确的格式,例如YYYYMMDD:

INSERT dbo.table_roaster_time_table([date]) VALUES('20120603');
Run Code Online (Sandbox Code Playgroud)

现在没有混乱.

  • @waqar这是你能做到这一点绝对最糟糕的方式.你的问题实际上与2012年6月6日存储的事实更相关,并认为是6月3日,实际上它是3月6日.您需要正确地存储日期,并且还需要注意将日期转换为varchar的建议是执行您尝试执行的操作的最低效方法 - 您是否阅读了可能的重复内容?另外,你怎么期望这个查询有意义?MONTH(存储日期)= DAY(今天)?我很困惑你为什么认为这会得到正确的结果. (2认同)