导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

SQL问题

lindawei 2003-12-25 02:19:09
在表中:
有字段 code date time 等等字段
01 2003-12-20 15:30:20
02 2003-12-20 15:30:25
…………………………………………
0123 2003-12-22 12:40:30
0128 2003-12-22 12:41:25

现在要求按照一段时间进行统计:
我选择日期和时间 从
开始日期:2003-12-20 开始时间:15:31:00
结束日期:2003-12-22 结束时间:12:41:00
那么 我只能提02和0123的记录
依次类推
我的意思就是 只限制开始日期的时间 和结束日期的时间 中间不管时间
只管日期。 sql那样实现???????????

...全文
10 点赞 收藏 18
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
lindawei 2003-12-25
好了 我解决了

谢谢 现在给分
回复
gmlxf 2003-12-25

q_main.SQL.Add('select distinct F_invoice from fee ');
q_man.SQL.Add('where (convert(varchar(10),[f_date],120)' + '+ '' '' ' + 'convert(varchar,[f_time],108))>=' + :s1');

--- 不好意思,语法我不清楚,你可以这样调试,你将你前台构造的SQL语句打印出来看看,将打印出来的与查询分析器里面正确的语句对比就知道了。

是你的字符窜连接问题了,打印出来在查询分析器中执行。
回复
lindawei 2003-12-25
q_main是adoquery
s1和s2是参数
q_main.Close;
q_main.SQL.Clear;
q_main.SQL.Add('select distinct F_invoice from fee ');
q_man.SQL.Add('where (convert(varchar(10),[f_date],120)+' '+convert(varchar,[f_time],108))>=:s1');
q_main.SQL.Add('and (convert(varchar(10),[f_date],120)+' '+convert(varchar,[f_time],108))<=:s2')
为什么这样写错误
回复
gmlxf 2003-12-25
如果放在一个字段处理就方便了

有convert函数可以转换日期的各种格式,很方便的。


-- 以下是convert参考
CONVERT
将某种数据类型的表达式显式转换为另一种数据类型。

语法

使用 CONVERT:

CONVERT (data_type[(length)], expression [, style])

参数
expression

是任何有效的 Microsoft® SQL Server™ 表达式。有关更多信息,请参见表达式。

data_type

目标系统所提供的数据类型,包括 bigint 和 sql_variant。不能使用用户定义的数据类型。有关可用的数据类型的更多信息,请参见数据类型。

length

nchar、nvarchar、char、varchar、binary 或 varbinary 数据类型的可选参数。

style

在表中,左侧的两列表示将 datetime 或 smalldatetime 转换为字符数据的 style 值。给 style 值加 100,可获得包括世纪数位的四位年份 (yyyy)。

不带世纪数位 (yy) 带世纪数位 (yyyy)
标准
输入/输出**
- 0 或 100 (*) 默认值 mon dd yyyy hh:miAM(或 PM)
1 101 美国 mm/dd/yyyy
2 102 ANSI yy.mm.dd
3 103 英国/法国 dd/mm/yy
4 104 德国 dd.mm.yy
5 105 意大利 dd-mm-yy
6 106 - dd mon yy
7 107 - mon dd, yy
8 108 - hh:mm:ss
- 9 或 109 (*) 默认值 + 毫秒 mon dd yyyy hh:mi:ss:mmmAM(或 PM)
10 110 美国 mm-dd-yy
11 111 日本 yy/mm/dd
12 112 ISO yymmdd
- 13 或 113 (*) 欧洲默认值 + 毫秒 dd mon yyyy hh:mm:ss:mmm(24h)
14 114 - hh:mi:ss:mmm(24h)
- 20 或 120 (*) ODBC 规范 yyyy-mm-dd hh:mm:ss[.fff]
- 21 或 121 (*) ODBC 规范(带毫秒) yyyy-mm-dd hh:mm:ss[.fff]
- 126(***) ISO8601 yyyy-mm-dd Thh:mm:ss:mmm(不含空格)
- 130* 科威特 dd mon yyyy hh:mi:ss:mmmAM
- 131* 科威特 dd/mm/yy hh:mi:ss:mmmAM
回复
gmlxf 2003-12-25
-- 合并两个日期与时间字段
declare @f_date datetime,@f_time datetime
set @f_date = '2003-12-24'
set @f_time = '13:30:25'
select @f_date 日期,@f_time 时间,convert(varchar(10),@f_date,120) + ' ' + convert(varchar,@f_time,108) [日期+时间]
回复
victorycyz 2003-12-25
但是在做月报表的时候不好做了啊
------------------------------

有什么不好处理的?

select ... from tablename where convert(varchar(6),日期时间字段,112)='200312'
回复
gmlxf 2003-12-25
SELECT DISTINCT F_invoice
FROM Fee
where convert(varchar(10),[f_date],120) + ' ' + convert(varchar,[f_time],108)
>='2003-12-24 13:30:25'
and
convert(varchar(10),[f_date],120) + ' ' + convert(varchar,[f_time],108)<='2003-12-25 13:58:30'

-- or

SELECT DISTINCT F_invoice
FROM Fee
where convert(varchar(10),[f_date],120) + ' ' + convert(varchar,[f_time],108)
between '2003-12-24 13:30:25' and '2003-12-25 13:58:30'
回复
lindawei 2003-12-25
做月报表的时候 我是提取日期 还做月报表了

distinct 不是有很多的日期

如:
2003-12-25 12:20:10
2003-12-25 12:25:10
回复
lindawei 2003-12-25
我知道处理成一个字段要方便

但是在做月报表的时候不好做了啊
回复
lindawei 2003-12-25
SELECT DISTINCT F_invoice
FROM Fee
where [f_date]+‘ ’+[f_time]>='2003-12-24 13:30:25' and [f_date]+ [f_time]<='2003-12-25 13:58:30'

在查询分析器 写的
不可以
回复
victorycyz 2003-12-25
我选择日期和时间 从
开始日期:2003-12-20 开始时间:15:31:00
结束日期:2003-12-22 结束时间:12:41:00
那么 我只能提02和0123的记录
------------------------------------
按你说的选取规则,02的记录怎么也会被选上吗?

另,不明白为什么要分两个字段存放日期时间。如果是一个字段,处理就很方便了。
回复
lindawei 2003-12-25
好象不行 我看了的
回复
gmlxf 2003-12-25
少了空格,看 txlicenhe(马可) 的代码,可以的。
回复
gmlxf 2003-12-25
你要把date与time合并成为一个datetime比较。
回复
caiyunxia 2003-12-25
select distinct code from 表
where CAST(CONVERT(CHAR(10),DATE,120) +' ' +[TIME] AS DATETIME)>=CAST(CONVERT(CHAR(10),开始日期,120) +' ' +开始时间 AS DATETIME) AND
CAST(CONVERT(CHAR(10),DATE,120) +' ' +[TIME] AS DATETIME)<=CAST(CONVERT(CHAR(10),结束日期,120) +' ' +结束时间 AS DATETIME)
回复
txlicenhe 2003-12-25
select distinct code from 表
where [date]+' ' + [time]
between 开始日期 + ' ' + 开始时间 and 结束日期 +' ' + 结束时间
回复
gmlxf 2003-12-25
select distinct code from 表 where
cast(([date] + [time]) as datetime) between '2003-12-20 15:31:00' and '2003-12-22 12:41:00'
回复
lindawei 2003-12-25
这样写肯定是不行的
因为时间只管开始日期。 和结束日期。 不管中间的时间
select distinct code from 表 where date>=开始日期 and time>=开始时间 and date<=结束日期 and time<=结束时间

在表中 date和time是分开的字段都是datetime类型。

我不想把时间和日期都写进去
用formatdatetime('yyyy-mm-dd',dp.datetime)写的
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告