sql语句 关于日期时间、类型转换的东西

(一)

1, select update_date, CONVERT(VARCHAR(30),update_date,111) jj ,CONVERT(VARCHAR(30),update_date,8) aa from report_month   //update_date为datetime型,结果显示为:

update_date                                     jj                          aa

2007-01-06 16:14:50.437                     2007/01/06              16:14:50

select DATEPART(mm,sign_date) montha,DATEPART(dd,sign_date) daya,sign_date  from report_day

montha       daya                             sign_date

5                  1                     2009-05-01 00:00:00.000

SELECT DATENAME(month, getdate()) AS ‘Month Name‘

2.按日期段查询:select * from report_day  where sign_date between ‘2009-5-1‘ And ‘2009-5-7‘(v)

select * from report_day  where sign_date between ‘2009-4‘ And ‘2009-5‘(x)

3. ----日期函数----
  DAY() --函数返回date_expression 中的日期值
  MONTH() --函数返回date_expression 中的月份值
  YEAR() --函数返回date_expression 中的年份值
  DATEADD(<datepart> ,<number> ,<date>)
  --函数返回指定日期date 加上指定的额外日期间隔number 产生的新日期
  DATEDIFF(<datepart> ,<number> ,<date>)
  --函数返回两个指定日期在datepart 方面的不同之处
  DATENAME(<datepart> , <date>) --函数以字符串的形式返回日期的指定部分
  DATEPART(<datepart> , <date>) --函数以整数值的形式返回日期的指定部分
  GETDATE() --函数以DATETIME 的缺省格式返回系统当前的日期和时间

----数据类型转换函数----
  CAST() 函数语法如下
  CAST (<expression> AS <data_ type>[ length ])
  CONVERT() 函数语法如下
  CONVERT(<data_ type>[ length ], <expression> [, style])

select cast(shift_id as int)+1  aa from report_day

select  sum(convert(real,work_days)),week_days  aa from report_day  group by week_days

adoquery2.SQL.add(‘select  emp_id  工号,round(sum(cast(ot_hrs as real)),2) 平时加班,round(sum(cast(work_hrs as real)),2) 工作小时 from report_day  group by emp_id‘);

例如:select id,A.Name,A.Age ,
convert(int, sum(case 工资项目 when‘基本工资‘ then 工资金额 end ) )基本工资,
cast( sum(case 工资项目 when ‘补贴‘then 工资金额 end )As int) as 补贴,
convert(int,sum(case 工资项目 when ‘津贴‘then 工资金额 end)) as 津贴,
convert(int,sum (工资金额)) as 合计
from A,B where id=Emp_id group by id,A.Name,A.Age

4.昨天想到的按日期统计数据,后来在自己电脑上看以前当的资料时,找到解决办法了,确实很实用。说白了,就是
只想得到日期或时间的一部分,而不是完整的日期和时间。然后在统计。

用到的数据库和表(MS SqlServer数据库)
use master
go

if exists(select * from sysdatabases where name=‘Spending‘)
drop database Spending

create database Spending
on
(
name=‘Spending_data‘,
filename=‘D:\Spending_data.mdf‘,
size=3 mb,
filegrowth=10%
)
log on
(
name=‘Spending_log‘,
filename=‘D:\Spending_log.ldf‘,
size=3 mb,
filegrowth=10%
)
go

use Spending
go

if exists(select * from sysobjects where name=‘consumption‘)
drop table consumption
go
create table consumption
(
  cid int primary key identity(1,1),
  cdate datetime not null,
  cmoney money not null
)
go

insert into consumption values(‘20090624‘,23)
insert into consumption values(‘20090625‘,56)
insert into consumption values(‘20090625‘,42)
insert into consumption values(‘20090626‘,45)
insert into consumption values(‘20090627‘,12)
insert into consumption values(‘20090628‘,32)
insert into consumption values(‘20090629‘,36)
insert into consumption values(‘20090701‘,16)

select * from consumption

比如我想统计每天的数据和(25号时候有两条记录)用下面语句,只统计6月份每一天的数据和(如果年份多,再加上限制条件)

select DATEPART(dd,cdate) as ‘号‘, sum(cmoney) from consumption  where datepart(mm,cdate)=6  group by DATEPART(dd,cdate)
显示结果
24    23.00
25    98.00
26    45.00
、、、

统计一周的如下

select DATEPART(wk,cdate) as ‘周‘, sum(cmoney) from consumption group by DATEPART(wk,cdate)
显示结果
26    178.00
27     84.00

统计月的如下

select datepart(mm,cdate) as ‘月份‘,sum(cmoney) from consumption where datepart(yy,cdate)=2009 group by datepart(mm,cdate)

显示结果
6    246.00
7     16.00

以上用到的就是“DATEPART()”函数。函数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

再有就是我们数据库某字段设计为 datetime类型后,插入数据后,自动将毫秒数都显示出来了
例如我上面插入的是 20090624,可是在查出来就变成2009-06-24 00:00:00.000,这样在页面
显示肯定有问题,这种情况可以用CONVERT()函数

CONVERT(data_type,expression,[style])

此样式一般在时间类型(datetime,smalldatetime)与字符串类型(nchar,nvarchar,char,varchar)
相互转换的时候才用到.

语句及查询结果:
SELECT CONVERT(varchar(100), cdate, 0):24 06 2009 21:57PM
SELECT CONVERT(varchar(100), cdate, 1): 06/24/09
SELECT CONVERT(varchar(100), cdate, 2): 09.06.24
SELECT CONVERT(varchar(100), cdate, 3): 24/06/09
SELECT CONVERT(varchar(100), cdate, 4): 24.06.09
SELECT CONVERT(varchar(100), cdate, 5): 24-06-09
SELECT CONVERT(varchar(100), cdate, 6): 24 06 09
SELECT CONVERT(varchar(100), cdate, 7): 06 24, 09
SELECT CONVERT(varchar(100), cdate,: 10:57:46
SELECT CONVERT(varchar(100), cdate, 9): 06 24 2009 21:57:46:827AM
SELECT CONVERT(varchar(100), cdate, 10): 06-24-09
SELECT CONVERT(varchar(100), cdate, 11): 09/06/24
SELECT CONVERT(varchar(100), cdate, 12): 090624
SELECT CONVERT(varchar(100), cdate, 13): 24 06 2009 21:57:46:937
SELECT CONVERT(varchar(100), cdate, 14): 10:57:46:967
SELECT CONVERT(varchar(100), cdate, 20): 2009-06-24 21:57:47
SELECT CONVERT(varchar(100), cdate, 21): 2009-06-24 21:57:47.157
SELECT CONVERT(varchar(100), cdate, 22): 06/24/09 21:57:47 PM
SELECT CONVERT(varchar(100), cdate, 23): 2009-06-24
SELECT CONVERT(varchar(100), cdate, 24): 10:57:47
SELECT CONVERT(varchar(100), cdate, 25): 2009-06-24 21:57:47.250
SELECT CONVERT(varchar(100), cdate, 100): 06 24 2009 21:57PM
SELECT CONVERT(varchar(100), cdate, 101): 06/24/2009
SELECT CONVERT(varchar(100), cdate, 102): 2009.06.24
SELECT CONVERT(varchar(100), cdate, 103): 24/06/2009
SELECT CONVERT(varchar(100), cdate, 104): 24.06.2009
SELECT CONVERT(varchar(100), cdate, 105): 24-06-2009
SELECT CONVERT(varchar(100), cdate, 106): 24 06 2009
SELECT CONVERT(varchar(100), cdate, 107): 06 24, 2009
SELECT CONVERT(varchar(100), cdate, 108): 10:57:49
SELECT CONVERT(varchar(100), cdate, 109): 06 24 2009 21:57:49:437PM
SELECT CONVERT(varchar(100), cdate, 110): 06-24-2009
SELECT CONVERT(varchar(100), cdate, 111): 2009/06/24
SELECT CONVERT(varchar(100), cdate, 112): 20090624
SELECT CONVERT(varchar(100), cdate, 113): 24 06 2009 21:57:49:513
SELECT CONVERT(varchar(100), cdate, 114): 10:57:49:547
SELECT CONVERT(varchar(100), cdate, 120): 2009-06-24 21:57:49

4,

1.显示本月第一天

SELECT DATEADD(mm,DATEDIFF(mm,0,getdate()),0)
select convert(datetime,convert(varchar(8),getdate(),
120)+‘01‘,120)

2.显示本月最后一天

select dateadd(day,-1,convert(datetime,convert
(varchar(8),dateadd(month,1,getdate()),120)+‘01‘,120))
SELECT dateadd(ms,-3,DATEADD(mm,DATEDIFF(m,0,getdate())+1,0))

3.上个月的最后一天

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

4.本月的第一个星期一i

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

5.本年的第一天

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

6.本年的最后一天

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

7.去年的最后一天

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

8.本季度的第一天

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

9.本周的星期一

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

10.查询本月的记录

select * from tableName where DATEPART(mm, theDate)
=DATEPART(mm, GETDATE()) and DATEPART(yy, theDate)
= DATEPART(yy, GETDATE())

11.查询本周的记录

select * from tableName where DATEPART(wk, theDate) = DATEPART
(wk, GETDATE()) and DATEPART(yy, theDate) = DATEPART(yy, GETDATE())

12查询本季的记录 注:其中:GETDATE()是获得系统时间的函数。

select * from tableName where DATEPART(qq, theDate) = DATEPART
(qq, GETDATE()) and DATEPART(yy, theDate) = DATEPART(yy, GETDATE())

13.获取当月总天数:

select DATEDIFF(dd,getdate(),DATEADD
(mm, 1, getdate()))

select datediff(day,
dateadd(mm, datediff(mm,‘‘,getdate()), ‘‘),
dateadd(mm, datediff(mm,‘‘,getdate()), ‘1900-02-01‘))

14.获取当前为星期几

DATENAME(weekday, getdate())

sql语句 关于日期时间、类型转换的东西

时间: 2024-11-24 02:25:21

sql语句 关于日期时间、类型转换的东西的相关文章

sql语句中日期时间格式化查询

      今天在做会员管理系统搜索时,我发现以前的搜索时间方式不太科学,效率也不是太高.由其是在查询指定的时间相等的时候,我在数据库中都存这样的时间格式"2007-5-22 14:32:12"当我们在查询2007-5-22是否与它相等,结果是不相等的.      所我们都喜欢找其它途径来解决这个问题.但是我发现我们的方法都不是太好,因为我们有的时候对sql sever的语句特性还了解的不够彻底.所以我查询了查sql server有帮助,终于发现个好东西,可以解决这个问题. CONVE

使用sql语句查询日期在一定时间内的数据

使用sql语句查询日期在一周内的数据 select * from ShopOrder where datediff(week,ordTime,getdate()-1)=0   //查询当天日期在一周年的数据 select * from ShopOrder where datediff(day,ordTime,getdate()-1)=0   //查询当天的所有数据 SELECT * FROM A where datediff(d,datetime,getdate()) <=30 //前30天 S

SQL语句获取各种时间的方法

SQL语句获取各种时间的方法1. 当前系统日期.时间select getdate() 2. dateadd 在向指定日期加上一段时间的基础上,返回新的 datetime 值例如:向日期加上2天select dateadd(day,2,'2004-10-15') --返回:2004-10-17 00:00:00.0003. datediff 返回跨两个指定日期的日期和时间边界数.select datediff(day,'2004-09-01','2004-09-18') --返回:174. dat

SQL语句中格式化时间

to_char(CREATETIME,'yyyy-MM-dd') SQL语句中格式化时间

MySQL 动态sql语句执行 用时间做表名

1. 描述 在使用数据的时候,我时候我们需要很多数据库,而且想用时间来做表名以区分.但是MySQL在存储过程中不支持使用变量名来做表名或者列名. 比如,有一个表我们想以"2015-07-16 12:00:00"命名. 2. 解决方案 如果只是更换一个普通的表名的话,很简单,直接使用下面sql语句即可: alter table old_table_name rename new_table_name 但是要以时间为表名,动态命名的话就不可以了.首先我们可以用NOW()函数获取系统当前的时

MySQL 动态sql语句运行 用时间做表名

1. 描写叙述 在使用数据的时候,我时候我们须要非常多数据库,并且想用时间来做表名以区分.可是MySQL在存储过程中不支持使用变量名来做表名或者列名. 比方,有一个表我们想以"2015-07-16 12:00:00"命名. 2. 解决方式 假设仅仅是更换一个普通的表名的话,非常easy.直接使用以下sql语句就可以: alter table old_table_name rename new_table_name 可是要以时间为表名,动态命名的话就不能够了.首先我们能够用NOW()函数

【Mysql】求出离最近相差X天的项,sql语句关于日期的比对

对于一张如下的testtable表,如果要查询date离现在相差的30年的日期 则应该使用如下的sql语句: select * from testtable where timestampdiff(year,date,now())<30 这种方法,即使date这个字段是varchar类型也是可以查询成功的. timestampdiff函数中,第一个字段是单位,可以改成second,day,month等 而如下的查询方法,考虑到1985离现在相差30年,虽然简单,但是如果日期的变更,比如明年,这条

统计mysql里每条SQL语句执行的时间

概述 通常为了测试一些工具的性能,不得不用数据说话.数据可以客观地证实一些东西.例如关于一些数据库中间件的性能,对于一个初学者来说只会看到表面上的夸词.我们不得不去证实,那就用具体的查询语句测试.然而每每在执行完一条语句,眼巴巴的看着黑屏一类的客户端,不由得打瞌睡走神,统计起来也头疼. 方法 打开mysql客户端 mysql -h127.0.0.1 -uroot -proot -P3306 选择数据库 use dbtest; 设置profiling set profiling=1; 执行SQL语

使用SQL语句查询日期(当月天数,当月第一天,当月最后一天,本年最后一天,当月第一个星期) 日期转字符串

取某月天数:select day(dateadd(month,1,'2012-02-01')-1) --当月天数 select day(dateadd(ms,-3,DATEADD(m, DATEDIFF(m,0,getdate())+1,0))) ---当月第一天 select dateadd(d,-day(getdate())+1,getdate()) ---当月最后一天 select dateadd(d,-1,dateadd(m,1,dateadd(d,-day(getdate())+1,g