使用分隔的日期字段(年,月,日)查找

时间:2011-07-02 11:52:13

标签: sql date

我在表格中的分隔字段中有以下日期。如何编写查询以显示两个日期之间的值。 例如:2011年2月1日至2011年2月6日之间的值:

day         month            year          value 
--------------------------------------------------
2             6                2011         120
3             7                2011         130
5             5                2011         100
6             1                2011         50

5 个答案:

答案 0 :(得分:3)

正如其他人所说,我的第一个建议是使用日期。或者,如果您需要比示例,日期时间或带时区的时间戳更详细的信息。

但是如果你真的需要使用这些数据,我认为这样的事情应该有效,这取决于你的SQL风格:

SELECT value, CONVERT(DATE,CONCAT(CONCAT(CONCAT(CONCAT(day, "-"), month), "-"), year), 105) date FROM table_name where (2/1/2011) <= date and date <= (2/6/2011);

(使用Oracle SQL,您可以使用to_date而不是转换并可选地使用||连接运算符;对于SQL服务器,您必须使用+连接运算符;对于MySQL,这应该是正确的)

(2011年2月1日)和(2/6/2011)可以是您转换为类似于其他转换的字符串,也可以使用PreparedStatement或类似的直接输入(这将是更好的选择)。

答案 1 :(得分:2)

转换为日期以便于比较而不用担心dmy或mdy,以标准方式:

 DATEADD(year, year-1900, DATEADD(month, month-1, DATEADD(day, day-1, 0)))

所以,这样的事情。要使用的最安全的日期格式为yyyymmdd(特别是对于SQL Server)

SELECT
  value,
  DATEADD(year, year-1900, DATEADD(month, month-1, DATEADD(day, day-1, 0))) AS realdate
FROM Mytable_name
WHERE
  '20110201' <= DATEADD(year, year-1900, DATEADD(month, month-1, DATEADD(day, day-1, 0))) 
  and
  DATEADD(year, year-1900, DATEADD(month, month-1, DATEADD(day, day-1, 0))) <= '20110206'

答案 2 :(得分:2)

我有相同的场景,但是Month列显示了Month name。通过对给定查询的轻微修改,我能够获取数据。

SELECT        *
FROM            Table_Name AS Tbl_Date
WHERE        (Year * 10000 + DATEPART(mm, CAST(Month + Year AS DATETIME)) * 100 + 1 
BETWEEN 20111101 AND 20121201)

希望这会有所帮助

答案 3 :(得分:1)

如果你使用的是oracle数据库,那么你可以使用TO_DATE和TO_CHAR函数来实现这个目标......

如下 -

  select * from table_name 
  where to_date(day||month||year,'DDMMYYYY') 
  between &mindate and &maxdate

最小日期,您可以将2-jan-2011和最大日期定为2-jun-2011

我希望它适合你:)

答案 4 :(得分:1)

我找到了答案,我想要感谢你们

SELECT Tbl_Date.Value,Tbl_Date.Year,Tbl_Date.Month,Tbl_Date.Day from Tbl_Date
where   ((Tbl_Date.Year*10000)+(Tbl_Date.Month*100)+Tbl_Date.Day)  between 110102 and 110602