作业帮 > 体裁作文 > 教育资讯

sql查询取某个时间段

来源:学生作业帮助网 编辑:作业帮 时间:2024/09/25 11:11:18 体裁作文
sql查询取某个时间段体裁作文

篇一:使用SQL语句查询时间段

使用SQL语句查询时间段

在项目中,如果需要查询时间段,该SQL语句应该如何写呢?下面就将教您使用SQL语句查询时间段的方法,希望对您有所启迪。

假设在SQL SERVER2000数据库中有一个表,表名为book,设置两个日期框,分别起名为起始时间和终止时间,其中在book中有一个DATETIME类型的字段,字段名假设为查询时间。

由于在SQL中只能用文本,所以先设一个时间转换为文本的子程序。

子程序名:时间格式 返回类型:文本型

参数:转换时间 类型:日期时间型

变量:时间 类型:文本型

变量:年 类型:文本型

变量:月 类型:文本型

变量:日 类型:文本型

年=到文本(取年份(转换时间))

月=到文本(取月份(转换时间))

日=到文本(取日(转换时间))

时间=年+"-"+月+"-"+日

返回(时间)

设置一个全局变量,变量名为记录集,类型为整数型,下面开始查询时间。

记录集=外部数据库。查询("select * from book wher 查询时间 between '"+时间格式(起始时间。今天)+"' and '"+时间格式(终止时间。今天)+"'")

说明:在这里要特别注意between要空一格然后加上一个单引号"'",and之前和之后都要空一格然后加上一个单引号"'"。

显示记录()

用sql语句按指定时间段分组统计

--> 生成测试数据: #tb

CREATE TABLE #tb(列名1 varchar(12),时间 datetime)

INSERT INTO #tb

SELECT '03174190188','2009-11-01 07:17:39.217' UNION ALL

SELECT '015224486575','2009-11-01 08:01:17.153' UNION ALL

SELECT '013593006926','2009-11-12 08:04:46.560' UNION ALL

SELECT '013599584239','2009-11-22 08:53:27.763' UNION ALL

SELECT '013911693526','2009-11-23 08:53:51.683' UNION ALL

SELECT '013846472440','2009-11-23 08:54:57.233' UNION ALL

SELECT '013990353697','2009-11-24 08:55:25.077' UNION ALL

SELECT '013990353697','2009-11-25 08:56:01.327' UNION ALL

SELECT '013945594843','2009-11-26 08:57:02.233' UNION ALL

SELECT '013990353697','2009-11-27 08:57:29.700' UNION ALL

SELECT '013916597421','2009-11-28 08:59:49.390' UNION ALL

SELECT '03916995857','2009-11-29 09:11:05.607' UNION ALL

SELECT '015097712001','2009-11-30 09:13:50.293'

--SQL查询如下:

DECLARE @minDate datetime,@maxDate datetime;

SELECT @minDate = '2009-11-1',@maxDate = '2009-12-01';

DECLARE @sql varchar(8000);

SET @sql = '';

SELECT @sql=@sql+',SUM(CASE WHEN DATEDIFF(day,B.时间,'''

+CONVERT(varchar(10),DATEADD(day,number,@minDate),120) +''')=0 THEN 1 ELSE 0 END) AS ['

+CONVERT(varchar(10),DATEADD(day,number,@minDate),120)+']' FROM master.dbo.spt_values

WHERE type = 'P' AND DATEADD(day,number,@minDate)<=@maxDate; print @sql

DECLARE @cmd nvarchar(4000);

SET @cmd = N'

SELECT ISNULL(A.时段,''合计'') AS 时段'+@sql+',

COUNT(列名1) AS 合计

FROM(

SELECT 时段=RIGHT(100+number,2)+'':00~''+RIGHT(100+number+1,2)+'':00'', MinDate = RIGHT(100+number,2)+'':00:00'',

MaxDate = RIGHT(100+number+1,2)+'':00:00''

FROM master.dbo.spt_values

WHERE type = ''P'' AND number < 24

) AS A

LEFT JOIN (SELECT * FROM #tb

WHERE 时间 BETWEEN @minDate AND @maxDate) AS B

ON CONVERT(varchar(8),B.时间,108) >= A.MinDate

AND CONVERT(varchar(8),B.时间,108) < A.MaxDate

GROUP BY A.时段 WITH ROLLUP;'

EXEC sp_executesql @cmd,N'@minDate datetime,@maxDate

datetime',@minDate,@maxDate;

print @cmd

DROP TABLE #tb;

行转列

--> 生成测试数据: #tb

CREATE TABLE #tb(列名1 varchar(12),时间 datetime)

INSERT INTO #tb

SELECT '03174190188','2009-11-01 07:17:39.217' UNION ALL

SELECT '015224486575','2009-11-01 08:01:17.153' UNION ALL

SELECT '013593006926','2009-11-12 08:04:46.560' UNION ALL

SELECT '013599584239','2009-11-22 08:53:27.763' UNION ALL

SELECT '013911693526','2009-11-23 08:53:51.683' UNION ALL

SELECT '013846472440','2009-11-23 08:54:57.233' UNION ALL

SELECT '013990353697','2009-11-24 08:55:25.077' UNION ALL

SELECT '013990353697','2009-11-25 08:56:01.327' UNION ALL

SELECT '013945594843','2009-11-26 08:57:02.233' UNION ALL

SELECT '013990353697','2009-11-27 08:57:29.700' UNION ALL

SELECT '013916597421','2009-11-28 08:59:49.390' UNION ALL

SELECT '03916995857','2009-11-29 09:11:05.607' UNION ALL

SELECT '015097712001','2009-11-30 09:13:50.293'

--SQL查询如下:

DECLARE @minDate datetime,@maxDate datetime;

SELECT @minDate = '2009-11-1',@maxDate = '2009-12-01';

select convert(char(10),dateadd(d,number,@minDate),120),

sum(case when convert(char(8),时间,108) between '00:00' and '01:00' then 1 else 0 end) as '00:00~01:00',

sum(case when convert(char(8),时间,108) between '01:00' and '02:00' then 1 else 0 end) as '01:00~02:00',

sum(case when convert(char(8),时间,108) between '02:00' and '03:00' then 1 else 0 end) as '02:00~03:00',

sum(case when convert(char(8),时间,108) between '03:00' and '04:00' then 1 else 0 end)

as '03:00~04:00',

sum(case when convert(char(8),时间,108) between '04:00' and '05:00' then 1 else 0 end) as '04:00~05:00',

sum(case when convert(char(8),时间,108) between '05:00' and '06:00' then 1 else 0 end) as '05:00~06:00',

sum(case when convert(char(8),时间,108) between '06:00' and '07:00' then 1 else 0 end) as '06:00~07:00',

sum(case when convert(char(8),时间,108) between '07:00' and '08:00' then 1 else 0 end) as '07:00~08:00',

sum(case when convert(char(8),时间,108) between '08:00' and '09:00' then 1 else 0 end) as '08:00~09:00',count(a.列名1) as 'sum'

from #tb a right join

master..spt_values b on datediff(d,时间,dateadd(d,number,@minDate)) = 0

where dateadd(d,number,@minDate) <= @maxDate and b.type = 'p' and b.number >= 0 group by convert(char(10),dateadd(d,number,@minDate),120) with rollup

--order by 1

drop table #tb

篇二:sql时间查询命令积累

在Oracle中查询某个时间段的记录时,sql的写法

select * from Oracle.alarmLog where alarmtime between to_date('2007-03-03 18:00:00','yyyy-mm-dd hh24:mi:ss') and to_date('2007-09-04 18:00:00','yyyy-mm-dd hh24:mi:ss')

我想要查询11:00:00.000到

15:00:00.000之间的数据,忽略date,只查time,怎么写SQL语句,请大家帮忙呀。

按照你的提问,以及你的要求

select * from event where datepart(hh,start_time) between 12 and 15

//开始时间为12到15小时之间

或者:

select * from event where datepart(hh,start_time) between 12 and 15 and datepart(hh,end_time)<15 and datepart(hh,end_time)>12

//开始时间为12到15小时之间,条件是end_time大于12小时,小于15小时 你试试看:

datepart()方法得到的是int型。不过我还是按你这个思路解决的,谢谢。

sql查询取某个时间段

SQL 查询离指定时间最后一次消费的记录。

表名TABLE 列名 id,name,time(消费的时间),price

查询每个人指定时间的最后一次消费记录。在线等。回答正确再加分。

select * from tb a where time=

(select max(time) from tb where a.name=name and time<@time)

SQL查询:如表:消费记录有很多,如何得到每个人的最后一次的消费记录, 假设表为T_ClientConsuemLog 字段包含:F_ClientConsumeID,F_ClientID,F_ClientConsumeDate,F_ClientConsumeMon

是同一个F_ClientID有很多条把?

select * from T_ClientConsuemLog,(

select max(F_ClientConsumeID) as fid from T_ClientConsuemLog group by F_ClientID) tablea

where T_ClientConsuemLog. F_ClientConsumeID = tablea.fid

我的表里面sj字段是datetime类型,要查询某一个日期的所有记录,sql语句怎么写? ndatetime是要查询的日期变量

Select * from table where sj = convert( ndatetime ,'YYYY-MM-DD')

篇三:SQL语句获取日期

SQL语句获取日期

核心提示:本教程为大家介绍SQL语句如何获取特定的日期。

SQL语句获取特定日期

1.一个月第一天的

Select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)

2.本周的星期一

Select DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)

3.一年的第一天

Select DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)

4.季度的第一天

Select DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)

5.当天的半夜

Select DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)

6.上个月的最后一天

Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))

7.去年的最后一天

Select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))

8.本月的最后一天

Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))

9.本年的最后一天

Select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))

10.本月的第一个星期一

select DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())), 0) 返回当前日期和时间

通过函数GETDATE(),你可以获得当前的日期和时间。函数GETDATE()可以用来作为DATEDIME型字段的缺省值。这对插入记录时保存当时的时间是有用的。要建立一个表,其中的记录包含有当前的日期和时间,可以添加一个DATETIME型字段,指定其缺省值为函数GETDATE()的返回值,就象这样:

Create TABLE site_log (

username VARCHAR(40),

useractivity VARCHAR(100),

entrydate DATETIME DEFAULT GETDATE())

转换日期和时间

函数GETDATE()的返回值在显示时只显示到秒。实际上,SQL Sever内部时间可以精确到毫秒级(确切地说,可以精确到3.33毫秒)。

要得到不同格式的日期和时间,你需要使用函数CONVERT()。例如,当下面的这个语句执行时,显示的时间将包括毫秒:

Select CONVERT(VARCHAR(30),GETDATE(),9)

注意例子中数字9的使用。这个数字指明了在显示日期和时间时使用哪种日期和时间格式。当这个语句执行时,将显示如下的日期和时间:

Nov 30 1997 3:29:55:170AM

(1 row(s) affected)

在函数CONVERT()中你可以使用许多种不同风格的日期和时间格式。下表显示了所有的格式。

日期和时间的类型:

类型值 标准 输出

0 Default mon dd yyyy hh:miAM

1 USA mm/dd/yy

2 ANSI yy.mm.dd

3 British/French dd/mm/yy

4 German dd.mm.yy

5 Italian dd-mm-yy

6 - dd mon yy

7 - mon dd,yy

8 - hh:mi:ss

9 Default + milliseconds--mon dd yyyy

hh:mi:ss:mmmAM(or )

10 USA mm-dd-yy

11 JAPAN yy/mm/dd

12 ISO yymmdd

13 Europe Default + milliseconds--dd mon yyyy

hh:mi:ss:mmm(24h)

14 - hh:mi:ss:mmm(24h)

类型0,9,和13总是返回四位的年。对其它类型,要显示世纪,把style值加上100。类型13和14返回24小时时钟的时间。类型0,7,和13返回的月份用三位字符表示(用Nov代表November).

对表中所列的每一种格式,你可以把类型值加上100来显示有世纪的年(例如,00年将显示为2000年)。例如,要按日本标准显示日期,包括世纪,你应使用如下的语句: Select CONVERT(VARCHAR(30),GETDATE(),111)

在这个例子中,函数CONVERT()把日期格式进行转换,显示为1997/11/30 抽取日期和时间

在许多情况下,你也许只想得到日期和时间的一部分,而不是完整的日期和时间。为了抽取日期的特定部分,你可以使用函数DATEPART(),象这样:

Select site_name ?Site Name?,

DATEPART(mm,site_entrydate) ?Month Posted? FROM site_directory

函数DATEPART()的参数是两个变量。第一个变量指定要抽取日期的哪一部分;第二个变量是实际的数据。在这个例子中,函数DATEPART()抽取月份,因为mm代表月份。下面是这个Select 语句的输出结果:

Site Name Month Posted

………………………………………………………………

Yahoo 2

Microsoft 5

Magicw3 5

(3 row(s) affected)

Month Posted列显示了每个站点被查询的月份。函数DATEPART()的返回值是一个整数。你可以用这个函数抽取日期的各个不同部分,如下表所示。

日期的各部分及其简写

日期部分 简写 值

year yy 1753--9999

quarter qq 1--4

month mm 1--12

day of year dy 1--366

day dd 1--31

week wk 1--53

weekday dw 1--7(Sunday--Saturday)

hour hh 0--23

minute mi 0--59

second ss 0--59

milisecond ms 0--999

当你需要进行日期和时间的比较时,使用函数DATEPART()返回整数是有用的。但是,上例中的查询结果(2,5)不是十分易读。要以更易读的格式得到部分的日期和时间,你可以使用函数DATENAME(),如下例所示:

Select site_name ?Site Name?

DATENAME(mm,site_entrydate) ?Month Posted?

FROM site_directory

函数DATENAME()和函数DATEPART()接收同样的参数。但是,它的返回值是一个字符串,而不是一个整数。下面是上例该用DATENAME()得到的结果: Site Name Month Postec

………………………………………………………………….

Yahoo February

Microsoft June

Magicw3 June

(3 row(s) affected)

你也可以用函数DATENAE()来抽取一个星期中的某一天。下面的这个例子同时抽取一周中的某一天和日期中的月份:

Select site_name ?Site Name?,

DATENAME(dw,site_entrydate)+ ?-? + DATENAME(mm,site_entrydate) ?Day and Month Posted? FORM site_directory

这个例子执行时,将返回如下的结果:

Site Name Day and Month Posted

………………………………………………………………………

Yahoo Friday - February

Microsoft Tuesday - June

Magicw3 Monday - June

(3 row(s) affected)

篇四:SQL Server获取某月某季某年最后一天的SQL语句

SQL Server获取某月某季某年最后一天的SQL语句

项目中用到的,获取已知年份的第一天和最后一天,觉得网来的不错,留下做个备用。

1.一个月第一天的

项目中用到的,获取已知年份的第一天和最后一天,觉得网来的不错,留下做个备用。

1.一个月第一天的

SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)

2.本周的星期一

SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)

3.一年的第一天

SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)

4.季度的第一天

SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)

5.当天的半夜

SELECT DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)

6.上个月的最后一天

SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))

7.去年的最后一天

SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))

8.本月的最后一天

SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))

9.本年的最后一天

SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))

10.本月的第一个星期一

select DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())), 0)

篇五:(原创)SQLServer 如何得到某个月的总天数

在SQLServer中如何来得到某个月的天数?

与一个月的最后一天相对应的号数即代表着这个月所拥有的天数。所以,只需要知道指定月份的最后一天的日期即可得到指定月份的天数。具体思路如下:

/*

获取指定月份的天数:

1.将指定日期在月份上增加1,使月份推移到下个月的同一天

2.将下个月的同一天往前推移到1号

3.使用下个月的1号在天数上减去1,就得到指定月份的最后一天的日期

4.将指定日期的最后一天的日期转换成'XXXX-XX-XX'的日期格式

5.字符串截取,获得本月最后一天的号数

6.将号数转换成INT类型

*/

我将该方法写入了一个函数,查询结果如下:

具体代码级注释如下:

GO

CREATE FUNCTION GetMonthDays(@Date DATETIME) RETURNS INT

AS

BEGIN

--声明一个变量,该变量用来存储一个月中的天数

DECLARE @DayCount INT;

--声明一个变量,该变量用来存储一个日期

DECLARE @NewDate DATETIME;

--声明一个变量,该变量用来存储一个VARCHAR类型的日期字符串

DECLARE @Var_NewDate VARCHAR(10);

--将目标日期的月份增加,使日期推移到下个月的同一天

SET @NewDate = DATEADD(MM,1,@Date);

--获取推移后的日期的年和月

SET @Var_NewDate = CONVERT(VARCHAR(7),@NewDate,120)

--得到表示推移后的日期再向前推移至该月份的号

SET @Var_NewDate = @Var_NewDate+'-01';

--不同的系统对于显示时间的方式不同。有的系统会将日期显示成"XXXX/XX/XX", --而有的系统会将时间显示成"XXXX-XX-XX".为了避免这两种不同显示日期的方式 --影响到对日期的转换,在此,采用统一的日期显示格式:"XXXX-XX-XX" SET @Var_NewDate = REPLACE(@Var_nEWdATE,'/','-');

--得到新的日期。这个日期表示的是距离目标日期的下一个月号的日期

SET @NewDate = CONVERT(DATETIME,@Var_NewDate);

--间新的日期向前推移一天,得到目标日期的最后一天的日期

SET @NewDate = DATEADD(D,-1,@NewDate);

--使目标日期的最后一天的日期一统一的日期格式来显示,然后转换成对应的日期字符串

SET @Var_NewDate = CONVERT(VARCHAR(10),@NewDate,120);

--在一个日期中,最后一天的号数就代表着该月份的总天数

--因此,只需要将表示最后一天的日期中的号数截取出来就行了,然后转换成INT类型 --在这里需要注意一点的就是,在SQLServer中的字符串截取与在C#种字符串的截取不同

--在SQLServer中截取的索引是从开始的,而在C#中截取的索引是从开始的 SET @DayCount = CONVERT(INT,SUBSTRING(@Var_NewDate,9,2));

--最后,将得到的天数返回就行了

RETURN @DayCount;

END

GO

开发随心,尽善尽美。

--月之江南

体裁作文