我有一个start_date和end_date。我想要得到这两个日期之间的日期列表。有人能帮我指出我的查询中的错误吗?

select Date,TotalAllowance 
from Calculation 
where EmployeeId=1
  and Date between 2011/02/25 and 2011/02/27

这里Date是一个datetime变量。


当前回答

select * from table_name where col_Date between '2011/02/25' 
AND DATEADD(s,-1,DATEADD(d,1,'2011/02/27'))

这里,首先向当前的endDate添加一天,它将是2011-02-28 00:00:00,然后减去一秒,使结束日期为2011-02-27 23:59:59。通过这样做,您可以获得给定间隔之间的所有日期。

output:
2011/02/25
2011/02/26
2011/02/27

其他回答

该查询适用于获取当前日期和接下来3个日期之间的值

SELECT * FROM tableName  WHERE columName 
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)

这最终将为当前日期增加额外3天的缓冲时间。

/****** Script for SelectTopNRows command from SSMS  ******/
SELECT TOP 10 [Id]
  ,[Id_parvandeh]
  ,[FirstName]
  ,[LastName]
  ,[RegDate]
  ,[Gilder]
  ,[Nationality]
  ,[Educ]
  ,[PhoneNumber]
  ,[DueInMashhad]

  ,[EzdevajDate]


  ,[MarriageStatus]
  ,[Gender]
  ,[Photo]

  ,[ModifiedOn]
  ,[CreatorIp]
   From
  [dbo].[Socials] where educ >= 3 or EzdevajDate  >= '1992/03/31' and EzdevajDate <= '2019/03/09' and MarriageStatus = 1

在这个线程中有很多糟糕的答案和习惯,当涉及到根据记录可能具有非零时间值的日期范围进行选择时——包括写作时第二高的答案。

永远不要使用这样的代码:Date between '2011/02/25' and '2011/02/27 23:59:59.999'

或者这样:日期>= '2011/02/25'和日期<= '2011/02/27 23:59:59.999'

想知道为什么,自己试试吧:

DECLARE @DatetimeValues TABLE
    (MyDatetime datetime);
INSERT INTO @DatetimeValues VALUES
    ('2011-02-27T23:59:59.997')
    ,('2011-02-28T00:00:00');

SELECT MyDatetime
FROM @DatetimeValues
WHERE MyDatetime BETWEEN '2020-01-01T00:00:00' AND '2020-01-01T23:59:59.999';

SELECT MyDatetime
FROM @DatetimeValues
WHERE MyDatetime >= '2011-02-25T00:00:00' AND MyDatetime <= '2011-02-27T23:59:59.999';

在这两种情况下,你会得到两行。假设您正在查看的日期值是旧的datetime类型,用于与这些日期比较的毫秒值为999的日期文字将舍入到下一秒的毫秒000,因为datetime并不精确到最近的毫秒。你可以有99.7或7000,但没有介于两者之间的。

您可以使用997毫秒值,这就可以工作了——假设您只需要使用datetime值,而不需要使用datetime2值,因为这些值可以更精确。例如,在这种情况下,您将错过时间值为23:59:59.99872的记录。例如,最初建议的代码也会错过时间值为23:59:59.9995的记录。

更好的是同一答案中提供的另一个解决方案-日期>= '2011/02/25'和日期< '2011/02/28'。在这里,无论查看的是datetime列还是datetime2列,都可以正常工作。

我想提出的另一个关键点是日期和时间字面量。'2011/02/25'不是一个好主意-取决于您正在工作的系统的设置,这可能会抛出一个错误,因为没有第25个月。使用适用于所有位置和语言设置的文字格式,例如。“2011 - 02 - 25 - t00:00:00”。

select * from test 
     where CAST(AddTime as datetime) between '2013/4/4' and '2014/4/4'

——如果数据类型不同

两件事:

使用引号 确保包括最后一天(结束于24) 选择日期,总津贴 从计算 EmployeeId = 1 and "2011/02/25" <= Date and Date <= "2011/02/27"

如果Date为DateTime。

我倾向于以这种方式进行范围检查,因为它清楚地显示了下限和上限。请记住,日期格式在不同的文化中有很大的不同。所以你可能要确保它被解释为一个日期。使用DATE_FORMAT(日期,'Y/m/d')。

(提示:使用STR_TO_DATE和DATE_FORMAT来切换范例。)