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())

原文地址:https://www.cnblogs.com/hzpin/p/3926286.html